Python自定义类dir()结果中__weakref__属性来源问题
Python自定义类中
__weakref__属性的来源 首先纠正一个认知偏差:object作为所有Python类的基类,其本身的实例不支持弱引用,因此直接执行dir(object)看不到__weakref__是正常现象,这个属性不是从父类继承而来。
当你使用class My:这种语法定义没有显式声明__slots__的普通自定义类时,Python解释器在类创建阶段会自动为新类注入两个特殊的描述符属性:
__dict__:为类实例提供存储自定义属性的字典入口__weakref__:为类实例提供弱引用支持的内部存储槽位,是weakref模块实现弱引用机制必需的绑定入口
你可以通过简单的代码验证这个逻辑:如果给类显式定义__slots__且不将__weakref__纳入slot列表,类就不会自动注入这个属性,实例也无法被弱引用:
import weakref # 带__slots__且不含__weakref__的类 class MyWithSlots: __slots__ = () print('__weakref__' in dir(MyWithSlots)) # 输出False try: obj = MyWithSlots() weakref.ref(obj) except TypeError as err: print(err) # 输出:cannot create weak reference to 'MyWithSlots' object
补充说明:__weakref__不是普通的可调用实例方法,是解释器层面实现的描述符对象,日常业务开发基本不需要直接操作这个属性。
内容的提问来源于stack exchange,提问作者hal
相关产品推荐
相关产品推荐

