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__
Bana bir tane kopya değil. Diğer soru ise 'dairesel referanslar' ile ilgili. – luoluo
https://stackoverflow.com/questions/14628486/why-arent-destructors-guaranteed-to-be-called-on-interpreter-exit –
Ve bir "Python statik değişken" nedir? Bu kavram var mı? –