据我所知,__weakref__
是在类中定义的描述符,因此,如果它从类的实例中调用,它将给出weakref
对象:
from weakref import ref
class A:
pass
obj = A()
wr = ref(obj)
print(obj.__weakref__ is wr) # True
关于A
类本身呢?元类type
没有__weakref__
描述符:
print("__weakref__" in type.__dict__) # False
为什么type
元类没有那个描述符?那么它存储在哪里?如何从类访问weakref
对象(这里是wr_of_A
) ?
from weakref import ref
class A:
pass
wr_of_A = ref(A)
print(A.__weakref__)
# <attribute '__weakref__' of 'A' objects>
似乎__weakref__
属性在Python中是作为机制的一部分公开的,允许用户创建的类能够选择它们是弱引用的还是不像数据模型上的__slots__
文本中所记录的那样。除此之外,即使它的内容是实例的弱参考,也似乎是一个实现细节——在数据模型文档中没有对__weakref__
的其他引用——这是一个"规范规范";的Python对象。在C实现中,__weakref__
描述符很可能使用对象的tp_weaklistoffset
插槽(在内存对象结构中)来检索弱引用对象(对不起,我没有深入研究代码来检查)。
然而,当一个人去到类型实例时,他们使用tp_weaklist
插槽指向它的弱引用,使用一种标记为仅供内部使用的机制,而根本不暴露给Python端。
简而言之:如果你在处理弱引用,总是使用weakref
模块中的函数。