继承
记得有句经典话,你可以使用你爸的抽屉,但你只有使用权,而没有抽屉所有权,因为抽屉是你爸的
所有类默认继承 object(object是所有类的基类)
1 2 3 4 5 6 7
| class Cat: pass
class Cat(object): pass
#两种方式一样 默认继承object
|
单继承
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| class Cat: def run(self): print('----run---')
class Bosi(Cat): pass
class Jiafei(Cat): pass
bosi = Bosi() bosi.run()
jf = Jiafei() jf.run()
|
继承的注意点,后代无法使用父类的私有属性和方法
你的牙刷和你爸的牙刷属于私有的
重写的应用
1 2 3 4 5 6 7 8 9
| class Cat: def run(self): print('----run---')
class Bosi(Cat): def run(self): print('----run RUN RUN---')
# 波斯猫的run方法跟父类不一致的时候可以自行定义行为——重写
|
如果想要在重写的方法里调用父类的方法
1 2 3 4 5 6 7 8
| class Cat: def run(self): print('----run---')
class Bosi(Cat): def run(self): super().run() print('----run RUN RUN---')
|
多继承
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| class Ma(object): def pao(self): print('----100km/h 跑----')
class Lv(object): def tuowupin(self): print('----托物品----')
# 多继承 class Luozi(Ma,Lv): pass
luozi = Luozi() luozi.pao() luozi.tuowupin()
|
注意点:如果马和驴都有 jiao()骡子继承谁的
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| class Ma(object): def pao(self): print('----100km/h 跑----') def jiao(self): print('----马在叫----')
class Lv(object): def tuowupin(self): print('----托物品----') def jiao(self): print('----驴在叫----') # 多继承 class Luozi(Ma,Lv): pass
luozi = Luozi() luozi.jiao() #是谁的?
|
如果继承多个类,每个类都有同名方法
1 2 3 4 5
| # 继承Ma的jiao class Luozi(Ma,Lv):
# 继承Lv的jiao class Luozi(Lv,Ma):
|
它有一个mro算法,不在本次总结范围之内
但是你看有查看调用类的先后顺序
1 2 3
| print(Luozi.__mro__) # 打印出继承类的先后顺序 # 继承时寻找方法会从头往后找,使用最先找到的
|
多态
地下城与勇士实例,以下是伪代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| class 勇士: def 攻击(self): print('按X XX XXX')
class 法师(勇士): def 攻击(self): print('魔法星弹。。。。')
class 鬼剑士(勇士): def 攻击(self): print('拔刀斩。。。。')
# 这是一个函数 def fight(obj): obj.攻击()
fight(勇士()) # '按X XX XXX' fight(法师()) # '魔法星弹。。。。' fight(鬼剑士()) # '拔刀斩。。。。'
|
不是勇士的子类可不可以调用fight?
可以,但是你要保证你自身有 「攻击( )」
1 2 3 4 5
| class 喷火龙: def 攻击(self): print("喷出火焰。。。。")
fight(喷火龙())
|