więc spodziewamy odniesienie do obiektu foo
zostać usunięte, gdy Bar
klasa została usunięta. I ogólnie to się dzieje. Jeśli spróbujesz
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
uzyskać
Foo init running
Bar init running
Destructor Bar
Destructor Foo
i widać oba destruktory nazywane zarówno w Pythonie 2.7 i Python 3.4. Jednak w Pythonie 2.7, Bar
nie jest prawidłowo niszczony podczas zamykania programu. Jak docs powiedzieć:
Nie jest zagwarantowane, że del() metody są nazywane dla obiektów, które nadal istnieją, kiedy wyjść tłumacza.
Dlaczego Bar
nie jest niszczony podczas wyjścia z interpretera?
Prawdopodobnie klasa w Pythonie 2.7 nie jest niszczona z powodu odwołań kołowych (patrz poniżej). W Pythonie 3.4 (po PEP 442) obiekty z odwołaniami kołowymi są niezawodnie niszczone (nawet jeśli mają metody __del__
), co może wyjaśniać zmianę.
Jednak to nie wyjaśnia całkowicie różnicy, ponieważ chociaż klasa jest w cyklu odniesienia, sama klasa nie ma destruktora.
Wygląda na to, że w Pythonie 2 obiekty z odwołaniami kołowymi nie są niezawodnie niszczone podczas zamykania interpretera, podczas gdy są w Pythonie 3.4. Podaję więcej informacji here.
edycji (więcej szczegółów na temat odniesienia okrągłych)
klasy zawierają referencje cykliczne z powrotem na siebie, z jednej strony przez ich słownika:
MyClass.__dict__['__dict__'].__objclass__ == MyClass
a po drugie poprzez szczegółach MRO:
MyClass in MyClass.__mro__
Nie jest to duplikat dla mnie. Drugie pytanie dotyczy "odwołań kołowych". – luoluo
https://staciverflow.com/questions/14628486/why-arent-destructors-guaranteed-to-be-called-on-interpreter-exit –
Co to jest "zmienna statyczna Pythona"? Czy ta koncepcja istnieje? –