在mixin中调用超类的setter

时间:2014-12-27 05:23:28

标签: python mixins super

假设我有以下(不太完全生物学正确)的类:

class AnimalBaseClass:
    def __init__(self):
        self._limbs = None

    @property
    def limbs(self):
        return self._limbs

    @limbs.setter
    def limbs(self, value):
        self.paws = value
        self._limbs = value


class BipedalMixIn:
    @property
    def limbs(self):
        return super().limbs

    @limbs.setter
    def limbs(self, value):
        self.bipedal = (value == 2)
        # does not work
        super().limbs = value

此处super().limbs = valuenot supported by python。如果BipedalMixIn不是mixin,我可以直接使用超类的名称,但有没有简单的替代方法,可以在mixin中调用超类的setter?

2 个答案:

答案 0 :(得分:0)

以下作品,虽然任何更简单的答案都值得赞赏。

class AnimalBaseClass:
    def __init__(self):
        self._limbs = None

    @property
    def limbs(self):
        return self._limbs

    @limbs.setter
    def limbs(self, value):
        self.paws = value
        self._limbs = value


class BipedalMixIn:
    @property
    def limbs(self):
        return super().limbs

    @limbs.setter
    def limbs(self, value):
        self.bipedal = (value == 2)
        # works!
        super(BipedalMixIn, self.__class__).limbs.__set__(self, value)


class Bird(BipedalMixIn, AnimalBaseClass):
    pass


bird = Bird()
bird.limbs = 2
print(bird.bipedal)    # True
print(bird.paws)        # 2

答案 1 :(得分:-1)

首先,如果您在Python 2.x下工作,请确保所有类直接或间接地从object继承。否则,@property根本不起作用。

在OP的链接错误中窃取this comment中的示例代码:

super(BipedalMixin, BipedalMixin).limbs.__set__(self, value)

让我们分开:

super(BipedalMixin, BipedalMixin)

通常,我们将实例作为第一个参数传递。在这里,我们改为传递一个类,专门查找类属性并禁用任何描述符魔术。

.limbs.__set__(self, value)

这将调用属性的__set__()方法,该方法调用setter。它通常由foo.limbs = bar语法自动调用。