假设我有以下(不太完全生物学正确)的类:
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 = value
为not supported by python。如果BipedalMixIn
不是mixin,我可以直接使用超类的名称,但有没有简单的替代方法,可以在mixin中调用超类的setter?
答案 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
语法自动调用。