Weakref和__slots__

Eci*_*ana 18 python weak-references

请考虑以下代码:

from weakref import ref

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

k = Klass()
r = ref(k)
Run Code Online (Sandbox Code Playgroud)

它可以工作,但当我取消注释__slots__它TypeError: "cannot create weak reference to 'Klass' object"在Python 2.6下打破.

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

Sam*_*pen 23

如果没有__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 ...>
Run Code Online (Sandbox Code Playgroud)

  • 这是一个很好的答案,但我无法用谷歌搜索。为了改进它的索引,我引用了在使用 __slots__ 创建对对象的引用时出现的错误消息:消息是“TypeError:无法创建对给定对象的弱引用”。它出现在 python 2.7、3.5、3.6、3.7 中,但有趣的是 - 不在 pypy 和 pypy3 中。 (2认同)

小智 6

您必须添加__weakref__到插槽列表.这是一个__slots__怪癖.在2.3之前,即使这样也行不通,但幸运的是你的版本不是那么老了.