【问题标题】:Python Multiple Inheritance/MixinPython多重继承/混合
【发布时间】:2011-08-19 19:21:44
【问题描述】:

我有以下问题:

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 实现calculate_animalCapitalizeAnimal 版本,同时保持其动物为puma?我对 Mixin 类如何调用 super() 函数感到困惑。

【问题讨论】:

    标签: python multiple-inheritance


    【解决方案1】:

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

    class C(CapitalizeAnimal, A):
         animal = 'puma'
    
         def __init__(self):
             super(C, self).__init__()
    

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


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

    【讨论】:

    • 因为A是第二个,它的计算版本不会覆盖CapitalizeAnimal的实现吗?
    • 抱歉,我的问题变得更复杂了。我不确定 CapitalizedAnimal 将如何处理知道 C 类的属性,并在 A 类上返回一个 super()
    • @Manny D: 是的,如果你像这样进行继承:class C(A, CapitalizeAnimal) 所以只会调用A.CapitalizeAnimal,除非你已经在A.CapitalizeAnimal 中调用super case所有的mro都会被遍历。
    • @Jasie: 如果你只想调用 calculate_animalA ,那么你添加你的 Mixin A.calculate_animal(self) ,但是如果你想调用所有类的 calculate_animal在 MRO 中,请改用 super
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-04-02
      • 2020-10-17
      • 1970-01-01
      • 1970-01-01
      • 2012-07-06
      • 2020-12-18
      • 2021-08-05
      • 1970-01-01
      相关资源
      最近更新 更多