2015-10-09 34 views
6

Aşağıdaki python statik sınıfları ne zaman değişken çöp toplanır? İletiyi statik değişkenden yoksun bırakıcıdan görmeyi bekliyordum.Python statik değişken ayırma

Foo init running 
Bar init running 
Destructor Bar 

bekliyordum:

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() 

çıkışı (Python 2.7) 'dir

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

Bana bir tane kopya değil. Diğer soru ise 'dairesel referanslar' ile ilgili. – luoluo

+2

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

+0

Ve bir "Python statik değişken" nedir? Bu kavram var mı? –

cevap

3

yüzden foo nesneye referans Silinecek beklenir zaman Bar sınıfı silindi. Ve bu genellikle ne olur. Eğer

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 

çalışırsanız ben

Foo init running 
Bar init running 
Destructor Bar 
Destructor Foo 

almak ve hem Python 2.7 ve Python 3.4 olarak adlandırılan her iki yıkıcı görebilirsiniz. Ancak, Python 2.7'de, Bar program kapanışı sırasında düzgün bir şekilde tahrip edilmiyor. dokümanlar söylediği gibi:

O del() yöntemleri hala tercüman çıkışları mevcut nesneler için dendiğini garanti edilmez.

Tercüman çıkışı sırasında neden Bar tahrip edilmiyor?

Python 2.7 sınıf çünkü dairesel referansların tahrip olmadığı muhtemel görünüyor (aşağıya bakınız). Python 3.4'te (PEP 442'den sonra) dairesel referanslı nesneler güvenilir bir şekilde imha edilir (__del__ yöntemlerine sahip olsalar dahi) ve bu değişimleri açıklayabilir. sınıf referans devrinde olmasına rağmen, sınıf kendisi bir yıkıcı olmadığı için

Ancak, bu tamamen farkı açıklamaz.

Python ile dairesel referanslarla 2 nesneler güvenilir onlar Python 3.4 içindedir, oysa tercüman çıkışında esnasında tahrip değil gibi görünüyor. Daha fazla bilgi vereceğim here.

düzenleme (dairesel başvurular hakkında daha fazla detay):

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

ve ikinci olarak MRO detayları ile:

sınıfları öncelikle kendi Sözlük aracılığıyla, kendi geri siklik referanslar içerebilir

MyClass in MyClass.__mro__ 
+0

Bu neden silinmediğini açıklamıyor. – luoluo

+0

Bu Python 2.7'nin bir özelliğidir ancak tasarım mantığını tam olarak anlamıyorum. – strubbly

+0

Hmm - daha fazla düşündüm ve akla yatkın bir açıklama ile geldim – strubbly