Weakref和__slots__

时间:2013-10-22 19:13:39

标签: python weak-references

请考虑以下代码:

from weakref import ref

class Klass(object):
    # __slots__ = ['foo']
    def __init__(self):
        self.foo = 'bar'

k = Klass()
r = ref(k)

它有效,但是当我取消注释__slots__时它会在Python 2.6下与TypeError: "cannot create weak reference to 'Klass' object"断开。

请问,有没有人知道这是否是Python和__slots__的固有限制,或者它是否是一个错误?如何解决它?

2 个答案:

答案 0 :(得分:22)

  

对于每个实例没有__weakref__变量,定义__slots__的类不支持对其实例的弱引用。如果需要弱引用支持,则将__weakref__添加到__slots__声明中的字符串序列。

来自Python documentation

如果您将__weakref__添加到__slots__,您的代码就会有效:

>>> from weakref import ref
>>>
>>> class Klass(object):
>>>     __slots__ = ['foo', '__weakref__']
>>>     def __init__(self):
>>>         self.foo = 'bar'
>>> k = Klass()
>>> k
 => <__main__.Klass object at ...>
>>> r = ref(k)
>>> r
 => <weakref at ...; to 'Klass' at ...>

答案 1 :(得分:6)

您必须将__weakref__添加到广告位列表中。这是__slots__ quirks之一。在2.3之前,即使这样也行不通,但幸运的是你的版本不是那么老了。