Python Multiple Inheritance / Mixin

时间:2011-08-19 19:21:44

标签: 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__()

现在,我想要一组来自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_animalpuma,同时将动物保持为{{1}}?我对Mixin类如何调用super()函数感到困惑。

2 个答案:

答案 0 :(得分:5)

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

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

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

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


此外,super仅适用于new style classes,因此您应该使A继承object(当然,除非您使用的是Python 3)。

答案 1 :(得分:0)

首先,如果唯一的操作是调用超级B,则C__init__()不需要__init__

问答:您是否尝试过class C(A, CapitalizeAnimal):和/或class C(A, CapitalizeAnimal):?即,省略#?