如何让Python同名类属性和实例属性拥有不同的内存地址?
问题原因
你当前的代码中,__init__方法内的bar: dict = {}仅定义了函数内部的局部变量,并没有绑定到实例对象上。当你访问a.bar时,Python在实例属性中找不到对应的key,就会自动 fallback 到类属性MyClass.bar,所以二者的内存地址完全一致。
解决方法
不需要删除原有类属性,只需要在__init__中把字典赋值给self.bar,绑定为实例属性即可,二者会独立存储,内存地址完全不同。
修正后的示例代码:
class MyClass: bar: dict = {} def __init__(self): # 给实例绑定同名属性 self.bar: dict = {} print(id(MyClass.bar)) a = MyClass() print(id(a.bar))
运行后会输出两个不同的内存地址。
补充说明
- 后续通过实例访问
bar时,会优先读取实例自身的属性,不会触发类属性的访问逻辑 - 如果需要主动调用类属性,直接使用
MyClass.bar即可,和实例属性互不影响,验证示例如下:
MyClass.bar["类属性测试"] = "类属性值" a.bar["实例属性测试"] = "实例属性值" print(MyClass.bar) # 输出:{'类属性测试': '类属性值'} print(a.bar) # 输出:{'实例属性测试': '实例属性值'}
内容的提问来源于stack exchange,提问作者jaried
相关产品推荐
相关产品推荐

