2013-03-14 14 views
8

私は、プログラムの終わりにオブジェクトが破棄される順序を保証していないことや、それが起こることを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 

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

答えて

6

Maybe my question is 'Where are class-shared variables actually stored?"

それはあなたの質問であれば、答えは「クラス上」である。

あなたのLARに対処するためにあなたが指摘したように、__del__はグローバル変数に依存することはできませんが、Aはグローバル変数であるため、依存することはできません。興味深いことに、私はドキュメントのこれの公式の声明を見つけることができませんが、__del__はグローバル変数を使用することはできませんこの事実にインターネット上の様々な参照があります。 Hereは1です:

When a Python program terminates the global variables in each module are set to None. The order in which this happens it undefined

あなたがself.__class__.count代わりのA.countを経由して、カウントにアクセスする場合、それは動作します。 (これは、self.countを使用した場合にも同様に機能します)

+1

インスタンスの '.__ class__'についてはどうなりますか? – FatalError

+1

@FatalError:そうです、参照の問題は赤いニシンです。問題は、クラス自体が削除されているのではなく、それを参照するグローバル変数がNoneに設定されていることです。私は私の答えを編集しました。 – BrenBarn

+2

奇妙なことに、私は '.__ class__'で試してみると同じ動作になります。この場合、 '__del__'を呼び出す前に' None'に設定されているかのように見えますが、これは驚くべきことです。 – FatalError

関連する問題