Python 多重继承/混入

6 投票
2 回答
10132 浏览
提问于 2025-04-16 23:58

我遇到了以下问题:

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__()

我该如何让 class C 实现 CapitalizeAnimal 版本的 calculate_animal,同时保持它的动物是 puma 呢?我对混合类(Mixin class)如何调用 super() 函数感到困惑。

2 个回答

0

首先,如果BC的唯一操作只是调用父类的__init__,那么它们就不需要自己写__init__()

关于你的问题:你有没有试过写成class C(A, CapitalizeAnimal):或者class C(A, CapitalizeAnimal):?也就是说,去掉#?

5

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

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

     def __init__(self):
         super(C, self).__init__()

想了解更多信息,可以去看看 MRO(方法解析顺序)。


另外,super 这个功能只适用于 新式类,所以你应该让 A 继承 object(当然,如果你用的是 Python 3,就不需要这样做)。

撰写回答