#!/usr/bin/env python
# coding:UTF-8
"""
@version: python3.x
@author:曹新健
@contact: 617349013@qq.com
@software: PyCharm
@file: 多重继承.py
@time: 2018/10/22 17:11
"""
'''
1.多重继承就是一次继承多个父类的程序片段,父类之间用逗号分隔开。
2.如果多重继承时,多个父类具有相同名称的方法,就要注意搜索顺序,基本上是从子类开始
寻找名称,接着是同一层级的父类从左到右搜索,再到更上层父类从左到右搜索,直到到达
顶层为止。
3.一个子类在寻找指定的属性或者方法时,会根据类的__mro__属性元组中的元素顺序寻找
(MRO全名是Method Resolution Order,即方法解析顺序),若想直到直接父类,则可以用
类的__bases__来得知父类是哪个或者哪些。
4.__mro__是只读属性,但可以通过修改__bases__来修改__mro__。
5.在定义类时,如果python解释器不能生成__mro__,会引发TypeError错误。
6.如果一个父类中定义了抽象方法,而另一个父类实现了一个方法,且名称一样,那么子类
继承这两个父类的顺序决定抽象方法是否得意实现。
7.判断一个抽象方法是否实现也是按照__mro__中类的顺序,如果在__mro__中先找到有类实现
了方法,后找到定义了抽象方法的类,那么就会认定已经实现了抽象方法。
'''
class Test1:
def test(self):
print("Test1 test")
class Test2:
def test(self):
print("Test2 test")
class T1(Test1,Test2):
pass
class T2(Test2,Test1):
pass
t1 = T1()
t2 = T2()
print(t1.test()) #打印Test1 test
print(t2.test()) #打印Test2 test
print(T1.__mro__)
#打印(<class '__main__.T1'>, <class '__main__.Test1'>, <class '__main__.Test2'>, <class 'object'>)
print(T2.__mro__)
#打印(<class '__main__.T2'>, <class '__main__.Test2'>, <class '__main__.Test1'>, <class 'object'>)
print(T1.__bases__)
#打印(<class '__main__.Test1'>, <class '__main__.Test2'>)
print(T2.__bases__)
#打印(<class '__main__.Test2'>, <class '__main__.Test1'>)