多重继承|Python



为什么在这个代码中没有调用A:[是因为mro:从左到右,那么应该调用A类吗?]

class A:

def __init__(self,name):
print('inside a',name)

class B:

def __init__(self,name):
print('inside b',name)

class C(B,A):

def __init__(self,name):
print('inside c',name)
super().__init__(name)

c = C('hello')

输出:

inside c hello
inside b hello

但当我把它定义为一个父类时,它就可以正常工作了。【为什么这里叫一个类】代码:

class D:

def __init__(self,name):
print('inside d',name)

class A(D):

def __init__(self,name):
print('inside a',name)
super().__init__(name)

class B(D):

def __init__(self,name):
print('inside b',name)
super().__init__(name)

class C(B,A):

def __init__(self,name):
print('inside c',name)
super().__init__(name)

c = C('hello')

输出:

inside c hello
inside b hello
inside a hello
inside d hello

根据方法解析顺序,以深度优先的搜索方法对成员进行搜索,即在您的第一个示例中:

class A:

def __init__(self,name):
print('inside a',name)
class B:

def __init__(self,name):
print('inside b',name)       

class C(B,A):

def __init__(self,name):
print('inside c',name)
super().__init__(name)

c = C('hello')

第一个:调用C的构造函数。

第二:因为你有super((init(name(在类C中,它将调用它的左父级,即B.

第三:它将尝试向右(类C(,但由于您尚未编写super((init(name(在类B中,不能调用类A的构造函数,因为它不能从类B移动到对象类

Object
/
/  
B    A
  /
/
C 

如果你要写super((init(name(在类B中,它将从Object类迭代到对象的右侧,即A类

例如:

class A:

def __init__(self,name):
print('inside a',name)

class B:
def __init__(self,name):
print('inside b',name)
super().__init__(name)

class C(B,A):

def __init__(self,name):
print('inside c',name)
super().__init__(name)

c = C('hello')

欲了解更多信息,请访问:https://www.geeksforgeeks.org/method-resolution-order-in-python-inheritance/

相关内容

  • 没有找到相关文章

最新更新