#python #python-3.x #inheritance #multiple-inheritance
#python #python-3.x #наследование #множественное наследование
Вопрос:
Почему A не вызывается в этом коде: [это из-за mro: слева направо, тогда должен быть вызван класс?]
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
Комментарии:
1. Чтобы
super()
правильно работать с множественным наследованием, вы должны использовать его в каждом классе в иерархии — даже базовых классах.
Ответ №1:
В соответствии с порядком разрешения метода поиск элементов выполняется по методологии углубленного первого поиска, то есть в вашем первом примере :
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
Object
/
/
B A
/
/
C
Если вы напишете super().init(name) в классе B , он будет повторяться от класса объекта справа от объекта, то есть класса 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 /
Комментарии:
1. Вы также можете просмотреть линеаризацию C3, чтобы лучше понять MRO en.wikipedia.org/wiki /…