当类属性遭遇实例属性,一场关于数据归属与访问优先级的隐形战争在Python对象模型中悄然上演
属性战场:命名空间的二元统治
class Battlefield:
terrain = "forest" # 类属性 (所有士兵共享)
def __init__(self, soldier_id):
self.weapon = f"gun_{soldier_id}" # 实例属性 (士兵私有)
# 战场环境全局共享
print(Battlefield.terrain) # 输出: forest
# 士兵装备各自独立
soldier1 = Battlefield("001")
soldier2 = Battlefield("002")
print(soldier1.weapon) # 输出: gun_001
查找优先级:实例的绝对压制
属性访问遵循实例优先原则:
- 检查实例的
__dict__ - 未找到则搜索类的
__dict__ - 沿继承链向上查找
soldier1.terrain = "desert" # 实例新建属性屏蔽类属性
print(soldier1.terrain) # 输出: desert (实例属性)
print(soldier2.terrain) # 输出: forest (类属性)
动态追踪:属性字典的实时战场
print(vars(soldier1))
# 输出: {'weapon': 'gun_001', 'terrain': 'desert'}
print(Battlefield.__dict__["terrain"])
# 输出: <member 'terrain' of 'Battlefield' objects>
高级装备:属性控制三神器
- @property装饰器:将方法伪装成属性
class Tank:
@property
def fuel(self):
return self._fuel * 0.8 # 计算剩余燃料
- 描述符协议:精细化控制存取逻辑
__slots__魔法:禁用__dict__提升内存效率
终极启示:类属性是共享的军备库,实例属性是士兵的专属武器。下个战场——你是否能解释Python方法解析顺序(MRO)如何解决钻石继承冲突?这关系到多重继承时属性的查找路径!

被折叠的 条评论
为什么被折叠?



