Python中__get__方法触发场景及property实例调用__get__的实现方法
手动触发描述符__get__方法的方式
描述符的__get__方法默认是Python解释器在访问绑定为类属性的描述符实例时,通过类的__getattribute__逻辑自动调用的,调用时会自动传入所属实例、所属类两个参数。如果你不想把描述符绑定到类上就触发方法,直接显式调用__get__并传入对应参数即可:
def get_five(*args): return 5 five = property(get_five) # 显式调用__get__,第一个参数为绑定的实例(无绑定可传None),第二个参数为所属类(可选) print(five.__get__(None)) # 输出5
附加问题解答
你的代码不会输出5的核心原因是:描述符协议仅对绑定为类属性的描述符实例生效。
你把property实例赋值给了self.b,也就是存到了实例自身的__dict__属性字典中。Python的属性查找逻辑中,实例自身__dict__里的属性优先级是高于描述符逻辑的,访问a.b时会直接返回实例字典里存的property对象本身,不会触发它的__get__方法,自然不会执行getter逻辑输出5。
如果要让property生效,必须把它定义为类属性:
class A: def setter(*args): print("setter") def getter(*args): print("getter") return 5 # 放在类层级作为类属性 b = property(getter, setter) a = A() a.b # 会输出getter,返回5
内容的提问来源于stack exchange,提问作者Joe Smith
相关产品推荐
相关产品推荐

