私は、プログラムの終わりにオブジェクトが破棄される順序を保証していないことや、それが起こることをPythonが保証していることを理解しています。なぜPythonはオブジェクトの前にクラス変数を破壊しますか?
私はクラスのデストラクタが他のモジュールを含むグローバル変数に依存できないことを理解しています。
しかし、クラスが破壊される前にクラスのオブジェクトを破壊しなければならないと思っていました。どうやらない:
のWindows 7上でclass A(object):
count = 0
def __init__(self):
A.count += 1
print 'Creating object, there are now', A.count
def __del__(self):
A.count -= 1
print 'Destroying object, there are now', A.count
a1 = A()
a2 = A()
のx64のPython v2.7.3は、私が取得:
Creating object, there are now 1
Creating object, there are now 2
Exception AttributeError: "'NoneType' object has no attribute 'count'" in <bound
method A.__del__ of <__main__.A object at 0x0234B8B0>> ignored
Exception AttributeError: "'NoneType' object has no attribute 'count'" in <bound
method A.__del__ of <__main__.A object at 0x0234BE90>> ignored
私はHow do I correctly clean up a Python object?の意味を理解しています。しかし、このケースは、クラス(私のC++フレンドにとっては共有または '静的')の変数です。確かにインスタンスにはクラス変数への参照がありますが、それはまだ参照が残っているので、最初に破棄すべきではありません。
クラスをそのクラスのオブジェクトより先に破壊するのは問題か間違いですか? たぶん私の質問はどこのクラスで共有変数が実際に格納されている」ある「
(はい、私はこれも単にコンテキストマネージャを使用して整流し、またはすることができることを理解する:?
del a1
del a2
オブジェクトを破壊しますクラスが破棄される前に。)
インスタンスの '.__ class__'についてはどうなりますか? – FatalError
@FatalError:そうです、参照の問題は赤いニシンです。問題は、クラス自体が削除されているのではなく、それを参照するグローバル変数がNoneに設定されていることです。私は私の答えを編集しました。 – BrenBarn
奇妙なことに、私は '.__ class__'で試してみると同じ動作になります。この場合、 '__del__'を呼び出す前に' None'に設定されているかのように見えますが、これは驚くべきことです。 – FatalError