20

考虑以下代码:

from weakref import ref

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

k = Klass()
r = ref(k)

它可以工作,但是当我取消注释时,它会在 Python 2.6 下__slots__中断。TypeError: "cannot create weak reference to 'Klass' object"

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

4

2 回答 2

27

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

来自Python 文档

如果添加__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 ...>
于 2013-10-22T19:22:34.027 回答
7

您必须添加__weakref__到插槽列表中。这是__slots__怪癖之一。在 2.3 之前,即使这样也不起作用,但幸运的是您的版本不是那么旧。

于 2013-10-22T19:23:04.833 回答