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
相关产品推荐
相关产品推荐

