如何从Python Property的__get__方法获取Getter函数及其属性?
解决方法:从Python Property中获取Getter函数及其属性
你不需要去操作__get__方法——Python的property对象本身就提供了直接访问getter/setter/deleter的公开属性:fget、fset、fdel,这才是正确的路径。
核心原理
property实例在创建时会把传入的三个函数分别存储在fget、fset、fdel属性中,你可以直接通过这些属性获取原始函数,进而访问函数上绑定的自定义属性。inspect.unwrap在这里无效,因为__get__是property类的描述器方法包装器,和你定义的getter函数不是同一个对象,它并不属于装饰器包装的层级。
修改后的示例代码
from inspect import unwrap class propholder: def __init__(self): self.__class__.propgetter._usecount=0 def propgetter(self): self.__class__.propgetter._usecount=self.__class__.propgetter._usecount +1 print(f"getcount= {self.__class__.propgetter._usecount}") return self.__class__.propgetter._pvalue # set by the setter def propsetter(self, v): self.__class__.propgetter._pvalue=v # function to delete _age attribute def propdeleter(self): del self.__class__.propgetter del self.__class__.propsetter del self.__class__.propdeleter aprop = property(propgetter, propsetter, propdeleter) ap = propholder() for i in [10,11,12]: ap.aprop=i print(f" ap.aprop={ap.aprop} ") # 正确获取getter函数的方式 prop = ap.__class__.aprop getter_func = prop.fget print(f"\n获取到的getter函数: {getter_func}") print(f"getter的_usecount属性值: {getter_func._usecount}") print(f"getter的_pvalue属性值: {getter_func._pvalue}") # 验证修改属性 getter_func._usecount = 100 ap.aprop # 调用后计数会变成101
修改后的运行结果
getcount= 1 ap.aprop=10 getcount= 2 ap.aprop=11 getcount= 3 ap.aprop=12 获取到的getter函数: <function propholder.propgetter at 0x7f8b1a0b3e50> getter的_usecount属性值: 3 getter的_pvalue属性值: 12 getcount= 101
补充说明
如果你的getter是动态生成的(比如通过装饰器或工厂函数创建),只要它被传入property构造函数,就会被存在fget属性里,无论有没有其他外部引用,都可以通过property实例的fget直接访问到它。
内容的提问来源于stack exchange,提问作者dakra137
相关产品推荐
相关产品推荐

