Я хотел бы понять, как удаление объектов работает на python. Вот очень простой набор кода.
class A(object):
def __init__(self):
setattr(self, "test", self._test)
def _test(self):
print "Hello, World!"
def __del__(self):
print "I'm dying!"
class B(object):
def test(self):
print "Hello, World!"
def __del__(self):
print "I'm dying"
print "----------Test on A"
A().test()
print "----------Test on B"
B().test()
Pythonista узнает, что я использую версию python 2.x. В частности, этот код работает на установке Python 2.7.1.
Этот код выводит следующее:
----------Test on A
Hello, World!
----------Test on B
Hello, World!
I'm dying
Удивительно, но объект A
не удаляется. Я могу понять почему, поскольку оператор setattr
в __init__
создает циклическую ссылку. Но это, кажется, легко решить.
Наконец, эта страница в документации Python (поддержка циклической сборки мусора) показывает, что можно иметь дело с такого рода циклической ссылкой.
Я бы хотел знать:
- почему я никогда не пользуюсь своим методом
__del__
в классеA
? - если мой диагноз циклической ссылки верен, почему мой подкласс
object
не поддерживает циклическую сборку мусора? - наконец, что делать с такого рода
setattr
, если я действительно хочу пройти через__del__
?
Примечание. В A
, если setattr
указывает на другой метод моего модуля, проблем нет.
setattr
имеет к этому какое-то отношение. Вы сохраняете связанный метод, который хранит объект. Вы также можете сохранить его с помощью обычного присваивания (self.test = self._test
). Пожалуйста, попробуйте, и если он выдаст тот же результат, вы можете упростить вопрос. - person   schedule 22.03.2012self.test = self._test
вызывает__setattr__
свойства объекта. Я прав? - person ohe   schedule 22.03.2012setattr
тоже должен это делать. Я считаю, чтоsetattr
даже уважает собственность. - person   schedule 22.03.2012