2015-10-09 8 views
6

以下のPython静的クラス変数がガベージコレクトされるのはいつですか? 私は静的変数fooデストラクタからメッセージを見ることを期待していました。Python静的変数割り当て解除

Foo init running 
Bar init running 
Destructor Bar 

私は期待していた:

class Foo(object): 
    def __init__(self): 
     print "Foo init running" 

    def __del__(self): 
     print "Destructor Foo" 

class Bar(object): 
    foo = Foo() 
    def __init__(self): 
     print "Bar init running" 

    def __del__(self): 
     print "Destructor Bar" 

bar_obj = Bar() 

は、出力は(Pythonの2.7)である

Foo init running 
Bar init running 
Destructor Foo 
Destructor Bar 
+0

私に重複するものではありません。もう一つの疑問は '循環参照 'である。 – luoluo

+2

https://stackoverflow.com/questions/14628486/whyarent-destructors-guaranteed-to-be-called-on-interpreter-exit –

+0

「Python静的変数」とは何ですか?このコンセプトは存在しますか? –

答えて

3

だから我々はfooオブジェクトへの参照が削除されることを期待するだろうというときBarクラスが削除されます。それは一般的に何が起こるかです。あなたは

class Foo(object): 
    def __init__(self): 
     print("Foo init running") 

    def __del__(self): 
     print("Destructor Foo") 

class Bar(object): 
    foo = Foo() 
    def __init__(self): 
     print("Bar init running") 

    def __del__(self): 
     print("Destructor Bar") 


def f(): 
    bar_obj = Bar() 

f() 
del Bar 

をしようとした場合、私は

Foo init running 
Bar init running 
Destructor Bar 
Destructor Foo 

を取得し、あなたは、Python 2.7とPython 3.4の両方で呼び出さ両方デストラクタを見ることができます。しかし、Python 2.7では、プログラム終了時にBarが適切に破壊されていません。ドキュメントが言うように:

それは保証されませんデル()メソッドは、インタプリタが終了まだ存在するオブジェクトのために呼ばれていること。

なぜ、Barは、通訳者の退室中に破壊されないのですか?

Python 2.7のクラスは、循環参照のために破壊されていないようです(下記参照)。 Python 3.4(PEP 442の後)では循環参照を持つオブジェクトは確実に破棄され(__del__メソッドを持っていても)、これが変更を説明するかもしれません。

ただし、クラスが参照サイクルにあるにもかかわらず、クラス自体にデストラクタがないため、この違いを完全には説明できません。

Python 2では、循環参照を持つオブジェクトはPython 3.4の中にあるのに対し、インタプリタの終了時に確実に破壊されないようです。私はさらにいくつかの情報を提供しますhere

編集(循環参照についての詳細):

MyClass.__dict__['__dict__'].__objclass__ == MyClass 

、第二に彼らのMROの詳細経由:

クラスは、まず自分の辞書を経由して、自分自身に戻って循環参照が含まれている

MyClass in MyClass.__mro__ 
+0

これは削除されない理由を説明しません。 – luoluo

+0

これはPython 2.7の機能ですが、私は設計の根拠を完全に理解していません。 – strubbly

+0

Hmm - より多くの考えと私は説得力のある説明を考え出した – strubbly

関連する問題