Python Multiple Inheritance/Mixin

atp*_*atp 6 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__(self):
        super(B, self).__init__()
Run Code Online (Sandbox Code Playgroud)

现在,我想要一组来自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__()
Run Code Online (Sandbox Code Playgroud)

我如何class C实现CapitalizeAnimal版本calculate_animal,同时保持其动物puma?我对Mixin类如何调用super()函数感到困惑.

mou*_*uad 5

父类的顺序很重要,你应该这样做:

class C(CapitalizeAnimal, A):
     animal = 'puma'

     def __init__(self):
         super(C, self).__init__()
Run Code Online (Sandbox Code Playgroud)

通过阅读MRO(方法解析顺序)可以找到更多信息.


此外,super仅适用于新样式类,因此您应该进行A继承object(当然,除非您使用的是Python 3).