在mixin中调用超级类的setter

2024-05-23 14:32:16 发布

您现在位置:Python中文网/ 问答频道 /正文

假设我有以下几类(生物学上不太正确):

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?在


Tags: selfreturninitvaluedefnotpropertymixin
2条回答

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

要从OP的链接bug中的this comment窃取示例代码:

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

让我们把这个分开:

^{pr2}$

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

.limbs.__set__(self, value)

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

下面的工作,尽管任何简单的答案是赞赏的。在

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

相关问题 更多 >