私は、Python がプログラムの最後にオブジェクトを破棄する順序を保証していないこと、またはそれが起こることさえ保証していないことを理解しています。
したがって、クラスのデストラクタは、他のモジュールを含むグローバル変数に依存できないことを理解しています。
しかし、クラスが破棄される前に、クラスのオブジェクトを破棄する必要があると思いました。どうやらそうではありません:
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()
Windows 7 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
Python オブジェクトを正しくクリーンアップするにはどうすればよいですか?の意味を理解しています。. しかし、これはクラス (私の C++ の友人にとって共有または「静的」) 変数の場合です。確かに、インスタンスにはクラス変数への参照がありますが、参照がまだ残っているため、最初に破棄すべきではありませんか?
そのクラスのオブジェクトの前にクラスを破棄することは問題ですか、それとも間違いですか? おそらく私の質問は、「クラス共有変数は実際にはどこに保存されているのですか?」
(はい、これはコンテキストマネージャーを使用して修正できることを理解しています:
del a1
del a2
クラスが破棄される前にオブジェクトを破棄します。)