8

私は、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

クラスが破棄される前にオブジェクトを破棄します。)

4

1 に答える 1

6

たぶん私の質問は「クラス共有変数は実際にどこに保存されているのですか?」です。

それがあなたの質問なら、答えは「クラスで」です。

より大きな質問に対処するには:ご指摘のとおり、グローバル変数に__del__依存Aすることはできませんが、グローバル変数であるため、信頼することはできません。__del__興味深いことに、これに関する公式の声明はドキュメントにありませんが、インターネット上には、グローバル変数を使用できない この事実に関するさまざまな参照があります。これが1つです:

Pythonプログラムが終了すると、各モジュールのグローバル変数はNoneに設定されます。これが発生する順序は未定義です

self.__class__.countの代わりにを介してカウントにアクセスすると機能しますA.count。(これは、使用するときにも機能する理由でもありますself.count。)

于 2013-03-14T04:16:47.213 に答える