Python多重继承,如果两个基类持有相同的方法,则调用第二个基类方法

Python多重继承,如果两个基类持有相同的方法,则调用第二个基类方法,python,class,Python,Class,Python多重继承,调用第二个基类方法,如果两个基类持有相同的方法,则尝试使用组合 +不惜一切代价避免多重继承,因为它太复杂而不可靠。如果你被它困住了,那么要准备好了解类的层次结构,并花时间寻找所有东西的来源。 +使用组合将代码打包成模块,这些模块在许多不同的不相关的地方和情况下使用。 +只有当有明确相关的可重用代码片段适合于一个公共概念时,或者由于您正在使用的某些东西而不得不使用继承时,才使用继承。 galaxyan的答案是作曲可能是最好的。多重继承的设计和调试往往很复杂,除非您知道自己在做

Python多重继承,调用第二个基类方法,如果两个基类持有相同的方法,则尝试使用组合

+不惜一切代价避免多重继承,因为它太复杂而不可靠。如果你被它困住了,那么要准备好了解类的层次结构,并花时间寻找所有东西的来源。
+使用组合将代码打包成模块,这些模块在许多不同的不相关的地方和情况下使用。
+只有当有明确相关的可重用代码片段适合于一个公共概念时,或者由于您正在使用的某些东西而不得不使用继承时,才使用继承。

galaxyan的答案是作曲可能是最好的。多重继承的设计和调试往往很复杂,除非您知道自己在做什么,否则很难做到正确。但如果你真的想要它,这里有一个答案解释你如何让它工作:

要使多重继承正常工作,基类通常需要与其子类协作。Python的
super
函数使得设置起来并不太困难。继承中涉及的类通常需要一个公共基(以停止继承链):

现在调用
Derived().amethod()
将打印
Derived
Base1
Base2
,最后是
CommonBase
。技巧在于
super
将每个调用传递给
self
的MRO中的下一个类,即使这不是当前类继承层次结构中的下一个类。因此
Base1.amethod
最终通过
super
调用
Base2.amethod
,因为它们在
派生的
实例上运行


如果在公共基类中不需要任何行为,那么它的方法体就是
pass
。当然,
派生的
类可以直接继承该方法,而无需编写自己的版本并调用
super
来获取其余的。

这可能会有所帮助:按照您在IRE A和B中的顺序进行操作,它与方法解析顺序有关
class A:
    def amethod(self): print("Base1")


class B():
    def amethod(self): print("Base3")

class Derived(A,B):
    pass

instance = Derived()
instance.amethod() 
#Now i want to call B method amethod().. please let me know the way.**
class A:
    def amethod(self): print("Base1")


class B:
    def amethod(self): print("Base3")

class Derived2:
    def __init__(self):
        self.a = A()
        self.b = B()

    def amthodBase1(self):
        self.a.amethod()

    def amthodBase3(self):
        self.b.amethod()

instance2 = Derived2()
instance2.amthodBase1() 
instance2.amthodBase3() 
class CommonBase:
    def amethod(self):
        print("CommonBase")
        # don't call `super` here, we're the end of the inheritance chain

class Base1(CommonBase):
    def amethod(self):
        print("Base1")
        super().amethod()

class Base2(CommonBase):
    def amethod(self):
        print("Base2")
        super().amethod()

class Derived(Base1, Base2):
    def amethod(self):
        print("Derived")
        super().amethod()