You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python __set__描述符行为疑问:构造函数赋值为何触发__set__?

问题解答

这是Python描述符机制的核心规则决定的:

  • LoggedAgeAccess实现了__set__方法,属于数据描述符(只要实现__set__就属于这类,有没有__get__不影响)。
  • 当你执行self.age = age时,Python会先检查self所属的Person类中,是否存在同名的数据描述符。
  • 由于Person类已经定义了age = LoggedAgeAccess()这个数据描述符,Python会直接调用该描述符的__set__方法,不会在self实例上创建新的专属age属性。
  • 只有当类中的同名属性不是数据描述符时,赋值self.age才会在实例层面创建属性,覆盖类级别的属性。

你可以通过打印实例的属性字典验证这一点:

x = Person("ABC", 27)
print(x.__dict__)  # 输出: {'name': 'ABC', '_age': 27}

能看到实例x的字典里并没有age,所有对self.age的读写操作,都会被类级别的描述符接管。

内容的提问来源于stack exchange,提问作者user3103957

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 17:03:12