首页 > 解决方案 > 在子类中覆盖时使用父属性设置器

问题描述

我有一种情况,我只覆盖属性上的设置器:

class Parent:
    @property
    def x(self):
        return self.__dict__['x']
    @x.setter
    def x(self, val):
        self.__dict__['x'] = f'P{val}'

class Child(Parent):
    @Parent.x.setter
    def x(self, val):
         super().x = val
         print('all set')

这里的 print 语句代表了我在调用父级的 setter 后想要做的处理。你可以忽略它。super().x = y是我调用所说的二传手的原生尝试。它失败了

Attribute error: 'super' object has no attribute 'x'

在子类中使用父类的属性设置器的正确方法是什么?

我宁愿避免以下情况,即使它工作得很好,因为它涉及显式调用 dunder 方法:

Parent.x.__set__(self, val)

作为奖励,有没有什么方法可以super()在儿童二传手的身体中使用?

标签: pythonpython-3.x

解决方案


您可以使用该属性的fset函数:

class Child(Parent):
    @Parent.x.setter
    def x(self, val):
        Parent.x.fset(self, val)
        print('all set')

推荐阅读