请考虑以下代码:
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__
的固有限制,或者它是否是一个错误?如何解决它?
答案 0 :(得分:22)
对于每个实例没有
__weakref__
变量,定义__slots__
的类不支持对其实例的弱引用。如果需要弱引用支持,则将__weakref__
添加到__slots__
声明中的字符串序列。
如果您将__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之前,即使这样也行不通,但幸运的是你的版本不是那么老了。