我想了解对象删除如何在 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
对象没有被删除。我可以理解为什么,因为 in 中的setattr
语句__init__
会产生循环引用。但这似乎很容易解决。
最后,在python 文档 (Supporting Cyclic Garbage Collection)中的这个页面显示了处理这种循环引用是可能的。
我想知道:
- 为什么我从不
__del__
在课堂上通过我的方法A
? - 如果我对循环引用的诊断是好的,为什么我的
object
子类不支持循环垃圾收集? setattr
最后,如果我真的想通过,如何处理这种情况__del__
?
注意:A
如果setattr
指向我模块的另一个方法,则没有问题。