继承
1 先说下什么是经典类 什么事是新式类
Python 2 当中类分为新式类和经典类 Python 3中全部叫新式类 python 2中如果有继承父类是object 就是新式类,继承其他类不算,但是如果继承其他类,其他类有其他了object 那就是新式类
经典类:
class 类名:
pass
新式类:
class 类名(object):
pass
2 Python 2 继承,如果类是经典类,继承方式如下图
3 Python 3 继承因为python 3 都是新式类 如果python 2是新式类也是这样的继承
class A(object):
def test(self):
print('from A')
class B(A):
def test(self):
print('from B')
class C(A):
def test(self):
print('from C')
class D(B):
def test(self):
print('from D')
class E(C):
def test(self):
print('from E')
class F(D,E):
# def test(self):
# print('from F')
pass
f1=F()
f1.test()
print(F.__mro__) #只有新式才有这个属性可以查看线性列表,经典类没有这个属性
#新式类继承顺序:F->D->B->E->C->A
#经典类继承顺序:F->D->B->A->E->C
#python3中统一都是新式类
#pyhon2中才分新式类与经典类
4 继承原理(python如何实现的继承)python 2中没有__mro__
python到底是如何实现继承的,对于你定义的每一个类,python会计算出一个方法解析顺序(MRO)列表,这个MRO列表就是一个简单的所有基类的线性顺序列表,例如
>>> F.mro() #等同于F.__mro__
[<class '__main__.F'>, <class '__main__.D'>, <class '__main__.B'>, <class '__main__.E'>, <class '__main__.C'>, <class '__main__.A'>, <class 'object'>]
为了实现继承,python会在MRO列表上从左到右开始查找基类,直到找到第一个匹配这个属性的类为止。
而这个MRO列表的构造是通过一个C3线性化算法来实现的。我们不去深究这个算法的数学原理,它实际上就是合并所有父类的MRO列表并遵循如下三条准则:
1.子类会先于父类被检查
2.多个父类会根据它们在列表中的顺序被检查
3.如果对下一个类存在两个合法的选择,选择第一个父类
5 super()子类中调用父类的方法
class A(object):
def __init__(self,name):
self.name = name
print(self.name)
def run(self):
print('测试测试测试')
print(self.name)
class B(A):
def __init__(self,age):
self.age = age
super().__init__('王Sir') #调用父类中的__init__方法
#super(B,self).__init__('王Sir') #还有另外一种调用方法,跟上面一样
def test(self):
super().run() #调用父类中的run方法 self都不用写了
print('test')
ret = B('22')
ret.run()
# 结果为:
# 王Sir
# 测试测试测试
# 王Sir