为什么在这个代码中没有调用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/