首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Weakref和__slots__

Weakref和__slots__
EN

Stack Overflow用户
提问于 2013-10-22 19:13:38
回答 2查看 3.6K关注 0票数 20

考虑以下代码:

代码语言:javascript
复制
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?怎么做-绕开它?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-10-22 19:22:34

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

来自Python文档

如果将__weakref__添加到__slots__中,则代码将工作:

代码语言:javascript
复制
>>> 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 ...>
票数 27
EN

Stack Overflow用户

发布于 2013-10-22 19:23:04

您必须将__weakref__添加到插槽列表中。它是怪癖之一。在2.3之前,甚至这个版本都不起作用,但幸运的是,您的版本并没有那么老。

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19526340

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档