在子类中覆盖时使用父属性设置器

时间:2018-08-16 14:46:23

标签: python python-3.x

我遇到的情况是,我只覆盖属性的设置器:

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')

在这里,打印语句表示我在调用父级的setter之后要执行的处理。您可以忽略它。 super().x = y是我调用该设置器的本机尝试。失败

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

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

即使它可以正常工作,我还是希望避免以下情况,因为它涉及显式调用dunder方法:

Parent.x.__set__(self, val)

作为奖励,有什么方法可以在孩子的二传手身上使用super()

1 个答案:

答案 0 :(得分:2)

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

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