Python基础教程(三十三)实例属性和类属性:Python类与实例的属性权杖之争,终极控制战

当类属性遭遇实例属性,一场关于数据归属与访问优先级的隐形战争在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

查找优先级:实例的绝对压制

属性访问遵循实例优先原则

  1. 检查实例的__dict__
  2. 未找到则搜索类的__dict__
  3. 沿继承链向上查找
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>

高级装备:属性控制三神器

  1. @property装饰器:将方法伪装成属性
class Tank:
    @property
    def fuel(self):
        return self._fuel * 0.8  # 计算剩余燃料
  1. 描述符协议:精细化控制存取逻辑
  2. __slots__魔法:禁用__dict__提升内存效率

终极启示:类属性是共享的军备库,实例属性是士兵的专属武器。下个战场——你是否能解释Python方法解析顺序(MRO)如何解决钻石继承冲突?这关系到多重继承时属性的查找路径!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

值引力

持续创作,多谢支持!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值