如何装饰Python父类property的getter或setter方法?
版本1失效原因
- 你在Square类
__init__中定义的area是局部变量,既没有绑定到实例也没有绑定到子类,访问sq.area时会直接沿用父类继承的areaproperty,自然不会触发子类逻辑。 - 如果你改为
self.area = xxx会报错,是因为父类的areaproperty只定义了getter,默认是只读属性,没有setter的情况下不允许给实例的area赋值。
版本2的告警原因与你的理解正误
关于“覆盖父类方法”的告警
你的理解不完全准确:@Shape.area.getter的本质是基于父类的area property生成一个新的property对象,再将这个新对象绑定为Square类的area属性。从类属性的角度看,子类确实新增了和父类同名的area属性,覆盖了继承的父类属性,IDE的静态检测识别到这一重名关系,所以给出覆盖提示,属于正常提示,不是报错。
关于Shape.area.fget(self)的告警
这是IDE静态检测的局限性导致的误报:父类Shape.area的fget存储的是你定义的未绑定函数def area(self):,调用时确实需要手动传入实例作为第一个参数,运行逻辑完全合法,只是IDE没有识别到fget的特殊属性,才会错误提示参数异常。
更规范的无告警写法
你可以用super()调用父类的area属性替代直接调用fget,既符合Python的继承调用规范,也不会触发IDE告警:
class Square(Shape): def __init__(self): super().__init__() @Shape.area.getter def area(self): print('hello child') return super().area
这种写法完全符合Python property的设计规则,不属于hack行为,你可以放心使用。
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

