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

Python中@property装饰器在类继承场景下的访问行为疑问

Python @property 继承场景访问问题解答

核心原因

你遗漏了Python的描述符协议这个关键概念:@property装饰器的本质是把目标方法包装成了一个实现了描述符协议的特殊对象,描述符的触发规则是:

  • 当你通过类实例访问描述符属性时,会自动调用描述符的__get__方法,也就是你写的getter逻辑
  • 当你直接通过类本身访问描述符属性时,默认只会返回描述符对象本身,不会触发__get__执行

你代码里的Base.fun_name1(self)是调用普通类方法,普通方法的执行逻辑是手动传入实例作为self参数就可以运行,但@property包装后的属性不是普通方法,不能用同样的调用方式,所以Base.fun_name只是拿到了property对象本身,不会执行你写的getter逻辑。

正确的写法

如果要在派生类中访问父类的fun_name属性,有几种合规方式:

  1. 直接通过实例访问:如果子类没有重写该property,直接用self.fun_name即可,会自动触发父类的getter
def sample_fun(self):
    # 其他原有代码
    print(self.fun_name) # 会正常触发getter输出对应内容
  1. 如果子类重写了fun_name的property,你想强制调用父类的版本,可以用super():
def sample_fun(self):
    # 其他原有代码
    print(super().fun_name) # 调用父类的property getter
  1. 如果你一定要通过类直接触发getter,可以手动调用描述符的__get__方法,传入当前实例:
def sample_fun(self):
    # 其他原有代码
    print(Base.fun_name.__get__(self, Base)) # 手动触发getter

修改后运行代码,控制台就会输出Entered the getter fun_name和对应的返回值,和你的预期一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 05:24:02