面向对象之继承
【一】继承介绍
【1】继承的作用
class Car(object):
def run(self):
print('I can run')
class Benz(Car):
...
class BWM(Car):
...
class Audi(Car):
...
car_1 = Benz()
car_2 = BWM()
car_3 = Audi()
car_1.run()
car_2.run()
car_3.run()
'''
I can run
I can run
I can run
'''
总结:
- 当子类继承父类后,子类就会拥有父类的所有方法
【2】子类重写方法后优先调用子类方法
- 当子类继承父类后,子类写了一个run方法,父类也写了一个run方法,子类调用run方法时,应该调用父类的run还是子类的?
class Car(object):
def run(self):
print('I can run')
class Benz(Car):
def run(self):
print('Benz can run')
class BWM(Car):
def run(self):
print('BWM can run')
class Audi(Car):
def run(self):
print('Audi can run')
car_1 = Benz()
car_2 = BWM()
car_3 = Audi()
car_1.run()
car_2.run()
car_3.run()
'''
Benz can run
BWM can run
Audi can run
'''
总结:
- 子类拥有和父类同样的方法后会优先调用自己的方法
【3】类的派生
class Car(object):
def __init__(self, weight):
self.weight = weight
def run(self):
print('I can run')
class Benz(Car):
def __init__(self, name, color):
self.name = name
self.color = color
def run(self):
print('Benz can run')
benz = Benz(name='e300', color='白色')
print(benz.name, benz.color) # e300 白色
print(benz.weight) # 报错
# 可是这里发现无法继承物流类`__init__`里的weight
class Car(object):
def __init__(self, weight):
self.weight = weight
def run(self):
print('I can run')
class Benz(Car):
def __init__(self, name, color,weight):
self.name = name
self.color = color
super().__init__(weight)
def run(self):
print('Benz can run')
benz = Benz(name='e300', color='白色',weight='20t')
print(benz.name, benz.color) # e300 白色
print(benz.weight) # 20t
- 使用super()超类,调用父类的方法,子类继承父类,子类有父类的属性,且子类有不同于父类的属性,那么这一过程我们成为类的派生
【二】新式类和经典类
什么是新式类 什么是经典类
'''
Python 2 当中类分为新式类和经典类
Python 3中全部叫新式类
python 2中如果有继承父类是object 就是新式类,继承其他类不算,但是如果继承其他类,其他类有其他了object 那就是新式类
'''
# 经典类
class 类名:
pass
# 新式类
class 类名(object):
pass
经典类的继承特点:深度优先
新式类的继承特点:广度优先
结合代码说明
class G(object):
def test(self):
print('from G')
class E(G):
def test(self):
print('from E')
class F(G):
def test(self):
print('from F')
class B(E):
def test(self):
print('from B')
class C(F):
def test(self):
print('from C')
class D(G):
def test(self):
print('from D')
class A(B,C,D):
def test(self):
print('from A')
a=A()
a.test()
print(A.__mro__) #只有新式才有这个属性可以查看线性列表,经典类没有这个属性
#新式类继承顺序:A->B->E->C->F->D->G
#经典类继承顺序:A->B->E->G->C->F->D
#python3中统一都是新式类
#pyhon2中才分新式类与经典类
MRO
- MRO(Method Resolution Order,方法解析顺序)是一个非常重要的概念,尤其在涉及多重继承的情况下。MRO 决定了 Python 如何在继承体系中搜索方法和属性,即当调用一个方法时,Python 会按照什么顺序去查找这个方法。
- 通过类的
__mro__
属性或者mro()
方法来查看任何类的方法解析顺序
class A:
pass
class B(A):
pass
class C(B):
pass
# 查看 MRO
print(C.__mro__)
# 或者
print(C.mro())