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

如何从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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 02:24:57