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