关于oop:python super()具有多个继承

Python super() with multiple inheritance

假设我想创建SomeClass,它继承了两个类:

class SomeClass(InheritedClass1, InheritedClass2):

InheritedClass1InheritedClass2都有相同名称的方法,称为performLogic

如果我声明super().peformLogic(),我将只从第一个参数/继承类得到结果。我需要两者的结果,所以我的问题是,有没有一种方法可以使用super()InheritedClass1调用方法,然后从InheritedClass2调用方法?

谢谢。

编辑:

我需要"求解"的类示例是这样构造的(为了简洁,简化并跳过了非必需的方法):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
class One:
    ...

    def getOutput(self):
        self.output = self.performLogic()
        return self.output

class Two(One):
    ...

    def getFirstValue(self):
        return input()

    def getSecondValue(self):
        return input()

class Three(Two):
    ...

    def performLogic(self):
        (some logic performation based on inputs from class Two methods)

class Four(Two):
    ...

    def performLogic(self):
        (some *different* logic performation based on inputs from class Two methods)

我现在需要做的是实现一个类,它将执行class Threeclass Four的逻辑,但只使用一对输入值。所以我宣布:

1
2
3
4
5
6
7
class Five(Three,Four):
    def performLogic(self):
        *and here I got stuck*
        *super().performLogic() will ask me for input values and returns the
        *result of class Three's performLogic()*
        *but what of class Four, I need the result of it'
s performLogic() with
        *a single pair of input values, too?*


super不是在父类中调用方法的通用替代品;它要求类之间进行协作设计。这意味着每个类都需要调用super().performLogic,以防它不是某个类的MRO的最后一个元素。最后,在方法解析顺序的末尾必须有一些类不能调用super().peformLogic(),因为它是列表中的最后一个类,或者下一个调用将委托给一个没有定义performLogic的类(如object)。在这种情况下,您必须自己提供这样的根类。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
class LogicPerformer:
    def performLogic(self):
        # No call to super; the buck stops here, because object
        # doesn't have this method
        print("In LogicPerformer")

class InheritedClass1(LogicPerformer):

    def performLogic(self):
        print("In InheritedClass1")
        super().performLogic()

class InheritedClass2(LogicPerformer):

    def performLogic(self):
        print("In InheritedClass1")
        super().performLogic()

class SomeClass(InheritedClass1, InheritedClass2):

    def performLogic(self):
        print("In SomeClass")
        super().performLogic()

a = SomeClass()
print(SomeClass.__mro__)
a.performLogic()


这实际上是一个非常有趣的问题。我认为语言中不会有任何允许这样做的特性。您基本上想要做的是使用语言中的方法解析来调用两个方法,其中方法解析总是解析一个方法。因此,这是不可能的。如果您想调用两个独立的方法,您需要自己显式地调用它。