继承:
#继承 #什么时候用继承? # 1.当类之间有显著的不同,并且较小的类是较大的类的所需的组建时,用组合比较好. # 2.当类之间有很多相同的功能,提取这些共同的功能做成基类,用继承比较好 # 单继承 class A(): M = 10000 def __init__(self,name): self.name = name def AA(self): print("AA") class B(A): pass class C(A): M = 999999 #在dict属性字典里,B是没有父类A 的属性的. print(A.__dict__) print(B.__dict__) #实例化后,B继承了A的类属性以及函数属性 abc = B('anec') print(abc.name) print(abc.M) print(abc.AA) #在C类中定义了M属性,所以访问M属性时,首先会从C类找M属性. #C类中新增M属性与父类相同,并不覆盖父类的M属性 abc = C("abc") print(abc.name) print(abc.M) print(A.M) print(abc.AA) # 继承循序: # python的类继承可以继承多个类,java和C#中则只能继承一个类 # python的类如果继承了多个类,那么其寻找方法的方式有两种: # 深度优先 # 广度优先 # # 当类是经典类时,多继承情况下,会按照深度优先方式查找 # 当类是新式类时,多继承情况下,会按照广度优先方式查找 # # 经典类和新式类,从字面上可以看出一个老一个新,新的必然包含了更多的功能,也就是之后推荐的写法, # 从写法上区分的类或者父类继承了object类,那么该类便是新式类,否则就是经典类. # 继承核心: #python 如何实现继承的,对于你定义的每一个类,python会计算出一个方法解析顺序(MRO)列表 #这个MRO列表就是一个简单的所有基类的线性顺序列表 #为了实现继承python会在MRO列表上从左到右开始查找基类,直到找到第一个匹配这个属性的类为止. # 而这个MRO列表的构造是通过一个C3线性算法来实现的.我们不去深究这个算法的数据原理 # 实际上就是合并所有父类的MRO列表并遵循如下三条准则 # 1.子类会优先于父类被检查 # 2.多个父类会根据他们在列表中的顺讯被检查 # 3.如果对下一个类存在两个合法的选择,选择第一个父类 # 新式类 #python3 以后都是新式类继承 class A(object): def test(self): print('A') class B(A): def test(self): print('B') class C(A): def test(self): print('C') class D(B): def test(self): print('D') class E(C): def test(self): print('E') class F(D,E): def test(self): print('F') #查看继承规则:(新式类才有的方法) print(F.mro()) #[<class '__main__.F'>, <class '__main__.D'>, <class '__main__.B'>, <class '__main__.E'>, <class '__main__.C'>, <class '__main__.A'>, <class 'object'>] # 新式类继承顺序:(先将一侧的类查询至基类之前一个类,再查询另一边类至基类) # F-D-B-E-C-A-object # 而经典类经常顺序为:(先将一侧的类查询完毕再查询第二类) # F-D-B-A-E-C