为什么class .__ weakref__不是None,而实例.__ weakref__是None?

时间:2016-04-24 20:32:56

标签: python weak-references python-internals

__weakref__与弱引用有关。我得到了弱引用背后的全部想法以及我可能会使用它们的地方。我唯一没有得到的内容如下所述:

实例没有属性__weakref__本身,与类不同,因此实例从类继承 __weakref__,这意味着{{1} }应与A.__weakref__

相同
A().__weakref__

为什么>>> class A: pass ... >>> A().__dict__ # Each instance starts out as an empty namespace {} >>> A.__weakref__ is None; False >>> A().__weakref__ is None #But this is True! True A.__weakref__ Noneinstance.__weakref__None,尽管实例从类继承__weakref__

1 个答案:

答案 0 :(得分:3)

一个班级有__weakref__ descriptor object;这就像property或方法一样;只有当您访问对象上的属性时,它才会自动绑定。弱引用的实际数据存储在C结构中,这是Python用于表示内存中的类和实例的数据结构的一部分。

因此,实例不需要自己的__weakref__属性。类描述符绑定到实例数据结构,然后C代码只查找正确的C结构以检索所需的信息。

访问类的属性,生成描述符对象本身。这不是None;它是描述符对象。在属性上,bound属性生成弱引用。没有弱引用,意味着返回None

您可以通过A.__dict__['__weakref__']访问对象(绕过正常的type.__getattribute__()绑定行为)重新创建描述符行为,然后直接调用__get__

>>> import weakref
>>> class A(object): pass
...
>>> a = A()
>>> A.__weakref__
<attribute '__weakref__' of 'A' objects>
>>> descriptor = A.__dict__['__weakref__']
>>> descriptor.__get__(None, A)
<attribute '__weakref__' of 'A' objects>
>>> a = A()
>>> a.__weakref__ is None
True
>>> descriptor.__get__(a) is None
True
>>> wr = weakref.ref(a)  # add a weak reference
>>> wr
<weakref at 0x10bd86d68; to 'A' at 0x10bad3588>
>>> a.__weakref__
<weakref at 0x10bd86d68; to 'A' at 0x10bad3588>
>>> descriptor.__get__(a)
<weakref at 0x10bd86d68; to 'A' at 0x10bad3588>