Я относительно новичок в ООП Python.
Хотя у меня есть некоторый опыт работы с JAVA OOP и я знаю значение метода «super», я изо всех сил пытаюсь понять, как он работает в python, когда у меня есть несколько наследований (которых нет в JAVA)
После того, как я покопался, чтобы найти ответы, я прочитал, что в соответствии с графиком наследования для каждого класса Python создал Порядок разрешения методов (MRO), чтобы определить, в каком порядке искать экземпляр метода.
Я также читал, что MRO определяется "старым стилем" или "новым стилем", в зависимости от моей версии Python.
У меня есть Python 3.7, поэтому я использую метод "новый стиль".
Если я правильно понимаю, каждый раз, когда я перезаписываю метод и вызываю 'super', python переходит к методу в классе, который появляется после текущего класса в MRO.
Действительно, когда я запускаю следующий код:
class A(object):
def go(self):
print("go A go!")
class B(A):
def go(self):
super(B, self).go()
print("go B go!")
class C(A):
def go(self):
super(C, self).go()
print("go C go!")
class D(B,C):
def go(self):
super(D, self).go()
print("go D go!")
if __name__ == "__main__":
d = D()
d.go()
print(D.__mro__)
Я получил вывод:
go A go!
go C go!
go B go!
go D go!
(<class '__main__.D'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.A'>, <class 'object'>)
Пока все хорошо, но когда я попытался запустить следующий код:
class A(object):
def foo(self):
print('this is A')
class B(object):
def foo(self):
print('this is B')
class AB(A,B):
def foo(self):
super(AB,self).foo()
print('this is AB')
if __name__ == '__main__':
x = AB()
x.foo()
print(AB.__mro__)
Я получил вывод:
this is A
this is AB
(<class '__main__.AB'>, <class '__main__.A'>, <class '__main__.B'>, <class 'object'>)
Вместо вывода, как я ожидал:
this is B
this is A
this is AB
(<class '__main__.AB'>, <class '__main__.A'>, <class '__main__.B'>, <class 'object'>)
Так что, видимо, я не понимаю, что происходит ...
Будем весьма благодарны за любые объяснения этой ситуации, а также за то, как именно Python определяет MRO (в соответствии с «новым стилем»)!