Python多重继承/混合
我有以下问题:Python多重继承/混合,python,multiple-inheritance,Python,Multiple Inheritance,我有以下问题: class A: animal = 'gerbil' def __init__(self): self.result = self.calculate_animal() def calculate_animal(self): print(self.animal) return self.animal class B(A): animal = 'zebra' def __init__(s
class A:
animal = 'gerbil'
def __init__(self):
self.result = self.calculate_animal()
def calculate_animal(self):
print(self.animal)
return self.animal
class B(A):
animal = 'zebra'
def __init__(self):
super(B, self).__init__()
现在,我想从a中得到一组特定的子类,来实现一个新函数,该函数计算与动物不同的东西,如下所示:
class CapitalizeAnimal:
def calculate_animal(self):
self.animal = self.animal.upper()
# I need to call some version of super().self.animal,
# but how will this Mixin class know of class A?
class C(A, #CapitalizeAnimal?):
animal = 'puma':
def __init__(self):
super(C, self).__init__()
我如何获得
C类
,以实现Capitalized animal
版本的calculate_animal
,同时将其动物保留为美洲狮
?我对Mixin类如何能够调用super()函数感到困惑。父类的顺序很重要,您应该这样做:
class C(CapitalizeAnimal, A):
animal = 'puma'
def __init__(self):
super(C, self).__init__()
更多信息可以通过阅读(方法解析顺序)找到
另外,
super
仅适用于,因此您应该创建一个继承对象(当然,除非您使用的是Python 3) 首先,B
和C
不需要\uuuu init\uuu()
,如果唯一的操作是调用super\uu init\uuuu
对于您的问题:您是否尝试过C类(A,大写动物):
和/或C类(A,大写动物):
?例如,省略#
和?
?,因为A是第二个,它的计算版本不会覆盖动物的实现吗?对不起,我让我的问题更复杂了。我不确定Danimal将如何处理知道类C的属性并在类上返回super()A@MannyD:是的,如果您这样做继承:class C(A,CapitalizeAnimal)
那么将只调用A.capitalAnimal
,除非您在A.CapitalizeAnimal
中已经调用了super
,在这种情况下,所有的mro都将被遍历。@Jasie:如果您只想调用A
的calculate\u animal
的super,那么您可以添加MixinA.calculate\u animal(self)
,但是如果您想调用MRO中所有类的calculate\u animal
,那么请使用super
。