Python多继承mro示例

                                 Python多继承mro示例

以下是python方法解析顺序的示例,详细的解释见代码的注释部分。

# 1 解释python mro的执行顺序,详见数字序号的顺序
class Base(object):
    def __init__(self): # 11. 进入 Base.__init__
        print("enter Base") # 12. 打印 enter Base
        print("leave Base") # 13. 打印 leave Base
class A(Base):
    def __init__(self): # 5. 进入 A.__init__
        print("enter A") # 6. 打印 enter A

        # 7. 这里将分为两步执行
        # 7.1 执行 c.__class__.mro()_
        # 7.2 返回 MRO 列表中的第三个元素,也就是 B
        super(A, self).__init__()
        print("leave A") # 15. 打印 leave A

class B(Base):
    def __init__(self): # 8. 进入 B.__init__
        print("enter B") # 9. 打印 enter B

        # 10. 这里将分为两步执行
        # 10.1 执行 c.__class__.mro()_
        # 10.2 返回 MRO 列表中的第四个元素,也就是 Base
        super(B, self).__init__()
        print("leave B") # 14. 打印 leave A

class C(A, B):
    def __init__(self):  # 2. 实例 C ,会进入 __init__
        print("enter C")  # 3. 打印 enter C
        # 4. 这里将分为两步执行
        # 4.1 执行 c.__class__.mro()
        # 4.2 返回 MRO 列表中的第二个元素,也就是 A
        super(C, self).__init__()
        print("leave C") # 16. 打印 leave A

c = C()  # 1. 首先代码会从这里开始执行。
print(c.__class__.mro())

""" 
enter C
enter A
enter B
enter Base
leave Base
leave B
leave A
leave C
[, , , , ]
"""

# 2 这里需要特殊说明,python3里的super其实是mro里的“super”,而不是按照子类的supper顺序走。
class BaseClass:
    num_base_calls = 0
    def call_me(self):
        print("Calling method on Base Class")
        self.num_base_calls += 1

class LeftSubclass(BaseClass):
    num_left_calls = 0
    def call_me(self):
        super().call_me()
        print("Calling method on Left Subclass")
        self.num_left_calls += 1

class RightSubclass(BaseClass):
    num_right_calls = 0
    def call_me(self):
        super().call_me()
        print("Calling method on Right Subclass")
        self.num_right_calls += 1

class Subclass(LeftSubclass, RightSubclass):
    num_sub_calls = 0
    def call_me(self):
        super().call_me()
        print("Calling method on Subclass")
        self.num_sub_calls += 1


s = Subclass()
s.call_me()
print(s.__class__.mro())

'''
Calling method on Base Class
Calling method on Right Subclass
Calling method on Left Subclass
Calling method on Subclass
[, , , , ]

'''

 

你可能感兴趣的:(Python案例)