7 继承与派生
2018-06-18 02:24:12来源:未知 阅读 ()
面向对象学习目录
1 面向对象介绍
2 类、实例、属性、方法详解
3 面向过程与面向对象进一步比较
4 类与对象
5 属性查找与绑定方法
6 小结
7 继承与派生
8 组合
9 抽象类
10 多态
11 封装
12 绑定方法与非绑定方法
13 内置方法(上)
14 内置方法(中)之描述符
15 内置方法(下)
16 元类
初识继承
1 class ParentClass1: #定义父类 2 pass 3 4 class ParentClass2: #定义父类 5 pass 6 7 class SubClass1(ParentClass1): #单继承,基类是ParentClass1,派生类是SubClass 8 pass 9 10 class SubClass2(ParentClass1,ParentClass2): #python支持多继承,用逗号分隔开多个继承的类 11 pass
1 >>> SubClass1.__bases__ #__base__只查看从左到右继承的第一个子类,__bases__则是查看所有继承的父类 2 (<class '__main__.ParentClass1'>,) 3 >>> SubClass2.__bases__ 4 (<class '__main__.ParentClass1'>, <class '__main__.ParentClass2'>)
1 >>> ParentClass1.__bases__ 2 (<class 'object'>,) 3 >>> ParentClass2.__bases__ 4 (<class 'object'>,)
继承与抽象(先抽象再继承)
继承与重用性
1 class Hero: 2 def __init__(self,nickname,aggressivity,life_value): 3 self.nickname=nickname 4 self.aggressivity=aggressivity 5 self.life_value=life_value 6 7 def move_forward(self): 8 print('%s move forward' %self.nickname) 9 10 def move_backward(self): 11 print('%s move backward' %self.nickname) 12 13 def move_left(self): 14 print('%s move forward' %self.nickname) 15 16 def move_right(self): 17 print('%s move forward' %self.nickname) 18 19 def attack(self,enemy): 20 enemy.life_value-=self.aggressivity 21 22 class Garen(Hero): 23 pass 24 25 class Riven(Hero): 26 pass 27 28 g1=Garen('草丛伦',100,300) 29 r1=Riven('锐雯雯',57,200) 30 31 print(g1.life_value) # 结果:300 32 r1.attack(g1) 33 print(g1.life_value) # 结果:243
再看属性查找
class Foo: def f1(self): print('Foo.f1') def f2(self): print('Foo.f2') self.f1() class Bar(Foo): def f1(self): print('Bar.f1') b=Bar() b.f2() # 打印结果: # Foo.f2 # Bar.f1
派生
1 class Riven(Hero): 2 camp='Noxus' 3 def attack(self,enemy): #在自己这里定义新的attack,不再使用父类的attack,且不会影响父类 4 print('from riven') 5 def fly(self): #在自己这里定义新的 6 print('%s is flying' %self.nickname)
1 class Riven(Hero): 2 camp='Noxus' 3 4 def __init__(self,nickname,aggressivity,life_value,skin): 5 Hero.__init__(self,nickname,aggressivity,life_value) #调用父类功能 6 self.skin=skin #新属性 7 8 def attack(self,enemy): #在自己这里定义新的attack,不再使用父类的attack,且不会影响父类 9 Hero.attack(self,enemy) #调用功能 10 print('from riven') 11 12 def fly(self): #在自己这里定义新的 13 print('%s is flying' %self.nickname) 14 15 r1=Riven('锐雯雯',57,200,'比基尼') 16 r1.fly() 17 print(r1.skin)
1 锐雯雯 is flying 2 比基尼
继承的实现原理
>>> F.mro() #等同于F.__mro__ [<class '__main__.F'>, <class '__main__.D'>, <class '__main__.B'>, <class '__main__.E'>, <class '__main__.C'>, <class '__main__.A'>, <class 'object'>]
- 子类会先于父类被检查
- 多个父类会根据它们在列表中的顺序被检查
- 如果对下一个类存在两个合法的选择,选择第一个父类
1 class A(object): 2 def test(self): 3 print('from A') 4 5 class B(A): 6 def test(self): 7 print('from B') 8 9 class C(A): 10 def test(self): 11 print('from C') 12 13 class D(B): 14 def test(self): 15 print('from D') 16 17 class E(C): 18 def test(self): 19 print('from E') 20 21 class F(D,E): 22 # def test(self): 23 # print('from F') 24 pass 25 26 27 f1=F() 28 f1.test() 29 print(F.__mro__) #只有新式才有这个属性可以查看线性列表,经典类没有这个属性 30 31 #新式类继承顺序:F->D->B->E->C->A 32 #经典类继承顺序:F->D->B->A->E->C 33 #python3中统一都是新式类 34 #pyhon2中才分新式类与经典类
在子类中调用父类的方法
1 class Vehicle: #定义交通工具类 2 Country='China' 3 def __init__(self,name,speed,load,power): 4 self.name=name 5 self.speed=speed 6 self.load=load 7 self.power=power 8 9 def run(self): 10 print('开动啦...') 11 12 class Subway(Vehicle): #地铁 13 def __init__(self,name,speed,load,power,line): 14 Vehicle.__init__(self,name,speed,load,power) 15 self.line=line 16 17 def run(self): 18 print('地铁%s号线欢迎您' %self.line) 19 Vehicle.run(self) 20 21 22 line13=Subway('中国地铁','180m/s','1000人/箱','电',13) 23 line13.run()
1 class Vehicle: #定义交通工具类 2 Country='China' 3 def __init__(self,name,speed,load,power): 4 self.name=name 5 self.speed=speed 6 self.load=load 7 self.power=power 8 9 def run(self): 10 print('开动啦...') 11 12 class Subway(Vehicle): #地铁 13 def __init__(self,name,speed,load,power,line): 14 #super(Subway,self) 就相当于实例本身 在python3中super()等同于super(Subway,self) 15 super().__init__(name,speed,load,power) 16 self.line=line 17 18 def run(self): 19 print('地铁%s号线欢迎您' %self.line) 20 super(Subway,self).run() 21 22 class Mobike(Vehicle):#摩拜单车 23 pass 24 25 line13=Subway('中国地铁','180m/s','1000人/箱','电',13) 26 line13.run()
1 #A没有继承B,但是A内super会因C调用到了A的test方法中的super().test(),而基于C.mro()继续往后找 2 class A: 3 def test(self): 4 super().test() 5 6 class B: 7 def test(self): 8 print('from B') 9 10 class C(A,B): 11 pass 12 13 c=C() 14 c.test() #打印结果:from B 15 16 17 print(C.mro()) 18 #[<class '__main__.C'>, <class '__main__.A'>, <class '__main__.B'>, <class 'object'>]
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
上一篇:5 属性查找与绑定方法
下一篇:8 组合
- Python基础总结之初步认识---class类的继承(终)。第十六天 2019-08-13
- python之函数、面向对象 2019-08-13
- PYTHON类的继承 2019-07-24
- 母版和继承的使用以及组件的使用 2019-07-24
- Python的面向对象2 2019-07-24
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash