我尝试使用一个静态列表创建一个类,它收集一个对象类的所有新实例。我所面临的问题似乎是,只要我尝试使用一个与整数相同的列表,我就不能再使用神奇的标记__del__
。在
我的例子:
class MyClass(object):
count = 0
#instances = []
def __init__(self, a, b):
self.a = a
self.b = b
MyClass.count += 1
#MyClass.instances.append(self)
def __str__(self):
return self.__repr__()
def __repr__(self):
return "a: " + str(self.a) + ", b: " + str(self.b)
def __del__(self):
MyClass.count -= 1
#MyClass.instances.remove(self)
A = MyClass(1,'abc')
B = MyClass(2,'def')
print MyClass.count
del B
print MyClass.count
通过评论,我得到了正确的答案:
^{pr2}$但是没有注释-包括现在的静态对象列表MyClass.instances实例我得到了错误的答案:
2
2
我的类似乎不能再访问它的__del__
方法了!怎么会?在
{来自}
当你取消注释时
^{pr2}$您正在
MyClass.instances
中存储对当前对象的引用。这意味着,引用计数在内部递增1。这就是为什么__del__
没有立即被调用。在若要解决此问题,请如下所示从列表中显式删除该项
现在可以打印了
一如预期。在
还有一种方法可以解决这个问题。即使用
weakref
。从docs因此,拥有
weakref
不会推迟对象的删除。使用weakref
,可以这样解决这个问题{{{cd6>如果它们已经是
所以,现在,当你说
del B
,即使weakref
是为B
而存在的,它也会调用__del__
(除非你让其他变量指向同一个对象,比如通过赋值)。在__del__
仅在没有剩余实例时调用。在您应该考虑只将弱引用放入
MyClass.instances
列表中。在这可以通过
import weakref
来实现,然后WeakSet
weakref.ref(self)
放入列表中。在每当删除最后一个“strict”引用时,
__del__
将被自动调用。那些懦夫会自动消失。在但是请注意,docs中提到的
__del__
有一些注意事项。在From to http://docs.python.org/2.7/reference/datamodel.html#basic-customization我引用(段落
object.__del__
后灰色):在这里您调用
del B
,但是在中仍然有一个B的实例MyClass.instances实例,因此B仍然被引用,因此不会被销毁,因此不会调用__del__
函数。 如果您直接调用B.__del__()
,它就可以工作了。在相关问题 更多 >
编程相关推荐