Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python多重继承/混合_Python_Multiple Inheritance - Fatal编程技术网

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,那么您可以添加Mixin
A.calculate\u animal(self)
,但是如果您想调用MRO中所有类的
calculate\u animal
,那么请使用
super