考虑以下代码:
from weakref import ref
class Klass(object):
# __slots__ = ['foo']
def __init__(self):
self.foo = 'bar'
k = Klass()
r = ref(k)它可以工作,但是当我取消对__slots__的注释时,它会在Python2.6下与TypeError: "cannot create weak reference to 'Klass' object"中断。
请注意,是否有人知道这是Python和__slots__固有的限制,还是bug?怎么做-绕开它?
发布于 2013-10-22 19:22:34
没有针对每个实例的
__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-22 19:23:04
您必须将__weakref__添加到插槽列表中。它是怪癖之一。在2.3之前,甚至这个版本都不起作用,但幸运的是,您的版本并没有那么老。
https://stackoverflow.com/questions/19526340
复制相似问题