2015-10-05 6 views
3

Существует разница в выходе, когда я использовал метод разрешения разрешения (MRO). Может ли кто-нибудь объяснить, почему это различие в результате.Наследование Python OOP: порядок разрешения метода (MRO)

class A: 
    def __init__(self): 
     pass 
    def abc(self): 
     print("A") 
class B(A): 
    def __init__(self): 
     pass 
    def abc(self): 
     super().abc() 
     print("B") 
class C(A): 
    def __init__(self): 
     pass 
    def abc(self): 
     super().abc() 
     print("C") 
class D(B,C): 
    def __init__(self): 
     super().abc() 
     print("D") 
obj=D() 
Output: 
A 
C 
B 
D 

//Using Method Resolution Order (MRO): 
    print(D.__mro__) 
    Output:(<class '__main__.D'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.A'>, <class 'object'>) 
+0

Каково ваше ожидаемое поведение? – Nilesh

+0

Можете ли вы объяснить, как именно были вызваны методы родительского класса, используя super() – Mathan

+0

Не передавайте аргументы super() – Mathan

ответ

2

Ваш выход только обратное, потому что при обходе дерева наследования в post-order. Сначала вы пересекаете иерархию, а затем распечатываете инструкцию. Вам нужно переключить это поведение. Сначала напечатайте (посетите узел), а затем перейдите по иерархии.

1. Loop: 
| 
+--1.1. Traversal (go hierarchy up) 
| 
+--1.2. Output (print) 

Вы должны сначала распечатать заявление, а затем пройти по иерархии:

1. Loop: 
| 
+--1.1. Output (print) 
| 
+--1.2. Traversal (go hierarchy up) 

изменить порядок вашей печати:

class A: 
    def __init__(self): 
     pass 
    def abc(self): 
     print("A") 
class B(A): 
    def __init__(self): 
     pass 
    def abc(self): 
     print("B") 
     super().abc() 
class C(A): 
    def __init__(self): 
     pass 
    def abc(self): 
     print("C") 
     super().abc() 
class D(B,C): 
    def __init__(self): 
     print("D") 
     super().abc() 
obj=D() 
Output: 
D 
B 
C 
A 
1

Первый вызов супер в D будет получить код для супер. В супер-вызове B будет использоваться mro D, а mro будет (C, A, объект). Это приземлится на супер. здесь снова будет использоваться m'm m, который будет (A, объект). Следовательно, выход будет A C B D

Смежные вопросы