Таким образом, мы ожидаем, что ссылка на объект 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
не уничтожается должным образом во время закрытия программы. Как говорят документы:
Не гарантируется, что методы del() будут вызываться для объектов, которые все еще существуют, когда интерпретатор завершает работу.
Почему Bar
не уничтожается при выходе из интерпретатора?
Кажется вероятным, что класс в Python 2.7 не уничтожается из-за циклических ссылок (см. ниже). В Python 3.4 (после PEP 442) объекты с циклическими ссылками надежно уничтожаются (даже если у них есть __del__
методов), и это может объяснить изменение.
Однако это не полностью объясняет разницу, поскольку, хотя класс находится в ссылочном цикле, сам класс не имеет деструктора.
Кажется, что в Python 2 объекты с циклическими ссылками не уничтожаются надежно при выходе из интерпретатора, тогда как в Python 3.4 они есть. Я даю дополнительную информацию здесь.
Изменить (подробнее о циклических ссылках):
Классы содержат циклические ссылки на самих себя, сначала через свой словарь:
MyClass.__dict__['__dict__'].__objclass__ == MyClass
и, во-вторых, через их данные MRO:
MyClass in MyClass.__mro__
person
strubbly
schedule
12.10.2015
circular references
. - person luoluo   schedule 09.10.2015