【发布时间】:2012-03-22 17:27:25
【问题描述】:
我想了解对象删除在 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 对象没有被删除。我可以理解为什么,因为__init__ 中的setattr 语句会产生循环引用。不过这个好像很容易解决。
最后,这个页面,在python documentation (Supporting Cyclic Garbage Collection),表明处理这种循环引用是可能的。
我想知道:
- 为什么我从不通过
A类中的__del__方法? - 如果我对循环引用的诊断是好的,为什么我的
object子类不支持循环垃圾回收? - 最后,如果我真的想通过
__del__,如何处理这种setattr?
注意:A 中如果setattr 指向我模块的另一个方法,则没有问题。
【问题讨论】:
-
我怀疑
setattr与它有什么关系。您正在存储一个绑定方法,该方法存储对象。您不妨通过常规分配 (self.test = self._test) 存储它。请尝试一下,如果它产生相同的输出,您可以简化问题。 -
哦,是的,它产生了同样的结果。但是,
self.test = self._test调用对象的__setattr__属性。我说的对吗? -
可以,但
setattr也应该这样做。我相信setattr甚至尊重属性。
标签: python garbage-collection setattr