1.继承:指的是类与类之间的关系,是一种什么是什么的关系,继承的功能是解决代码的重用问题,继承是一种创建新类的方式
python 中新建的类可以继承一个或多个父类(基类或超类)
新建的类称为派生类或子类
对象之间相似的特征-------类
类之间相似的特征 ---- 父类
继承:是基于抽象的结果,通过编程语言去实现它,肯定是先经历抽象这个过程,才能通过继承的方式去表达出抽象的结构。
1 class ParentClass1: 2 pass 3 4 class ParentClass2: 5 pass 6 7 class SubClass1(ParentClass1): 8 pass 9 10 class SubClass2(ParentClass1,ParentClass2): 11 pass 12 13 # print(SubClass1.__bases__) 14 # print(SubClass2.__bases__) 15 # 16 # # (<class '__main__.ParentClass1'>,) 17 # # (<class '__main__.ParentClass1'>, <class '__main__.ParentClass2'>) 18 19 20 class Hero: 21 def __init__(self,name,attack,life_value): 22 self.name = name 23 self.attack = attack 24 self.life_value = life_value 25 26 def attack_other(self,enemy): 27 enemy.life_value -= self.attack 28 if enemy.life_value <= 0: 29 print('%s 没有血量,宣布死亡!'% enemy.name) 30 else: 31 print('%s血量剩余%s'% (enemy.name,enemy.life_value)) 32 class HeroDog(Hero): 33 pass 34 35 class HeroPig(Hero): 36 pass 37 38 hero_d = HeroDog('Dog',10,100) 39 hero_p = HeroPig('pig',20,100) 40 41 # hero_d.attack_other(hero_p) 42 43 继承属性查找小练习: 44 45 练习一: 46 class Foo: 47 def f1(self): 48 print('from Foo.f1') 49 def f2(self): 50 print('from Foo.f2') 51 self.f1() 52 53 class Bar(Foo): 54 def f2(self): 55 print('from Bar.f2') 56 57 b1 = Bar() 58 b1.f2() 59 # from Bar.f2 60 b1首先在自己这个对象中找f2(),找不到然后去自己所在的类Bar中去找,找到了输出结果 61 62 练习二: 63 class Foo: 64 def f1(self): 65 print('from Foo.f1') 66 def f2(self): 67 print('from Foo.f2') 68 self.f1() # b.f1() 69 70 class Bar(Foo): 71 def f1(self): 72 print('from Bar.f1') 73 74 b1 = Bar() 75 b1.f2() 76 # from Foo.f2 77 # from Bar.f1 78 # b1首先在自己这个对象中找f2(),找不到然后去自己所在的类Bar中去找, 79 # 仍然找不到就会去Bar的父类Foo中去找,找到了,首先打印的是'from Foo.f2', 80 # 然后会执行self.f1(),由于这个self就是对象b1,所以会继续前面的寻找方式, 81 # 先去自己本身的对象中找,找不到去所在的类,找不到在去类所在的父类!
2.派生:子类可以添加自己的 新属性 数据属性 函数属性
查找顺序:1.对象本身--》2.对象所在的类里面找--》3.父类里面找
1 class Hero: 2 def __init__(self,name,attack,life_value): 3 self.name = name 4 self.attack = attack 5 self.life_value = life_value 6 7 def attack_other(self,enemy): 8 enemy.life_value -= self.attack 9 if enemy.life_value <= 0: 10 print('%s 没有血量,宣布死亡!'% enemy.name) 11 else: 12 print('%s血量剩余%s'% (enemy.name,enemy.life_value)) 13 14 class HeroDog(Hero): 15 camp = 'Dog_camp' 16 def attack_other(self,enemy): 17 print('from HeroDog class') 18 19 class HeroPig(Hero): 20 camp = 'Pig_camp' 21 22 hero_d = HeroDog('Dog',10,100) 23 hero_p = HeroPig('pig',20,100) 24 hero_d.attack_other(hero_p)
3.继承的实现原理: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'>]
0.对象本身优先于子类
1.子类会先于父类被检查
2.多个父类会根据它们在列表中的顺序被检查
3.如果对下一个类存在两个合法的选择,选择第一个父类
在Java和C#中子类只能继承一个父类,而Python中子类可以同时继承多个父类,如果继承了多个父类,那么属性的查找方式有两种,
分别是:深度优先和广度优先 (本质按列表顺序来) --》只是一种排序的不同方式
python中类分为两种:1.新式类 2.经典类 (py2中)
1.新式类 (py3 --> 只有新式类)
1 # 在python2中-》 经典类:没有继承object的类,以及他的子类都称之为经典类 2 # class Foo: 3 # pass 4 # 5 # class Bar(Foo): 6 # pass 7 8 # 在python2中-》 新式类:继承了object的类,以及他的子类都称之为经典类 9 # class Foo(object): 10 # pass 11 # 12 # class Bar(Foo): 13 # pass 14 15 # 在python3中-》 新式类:一个类没有继承object类,默认就继承object 16 # class Foo: 17 # pass 18 # print(Foo.__bases__) 19 20 21 # 验证多继承情况下的属性查找 -- # F D B X E C A 新式类 --》 广度优先 22 class A(object): 23 # def test(self): 24 # print('from A') 25 pass 26 27 class B(A): 28 # def test(self): 29 # print('from B') 30 pass 31 32 class C(A): 33 # def test(self): 34 # print('from C') 35 pass 36 37 class D(B): 38 # def test(self): 39 # print('from D') 40 pass 41 42 class E(C): 43 # def test(self): 44 # print('from E') 45 pass 46 47 class F(D,E): 48 # def test(self): 49 # print('from F') 50 pass 51 f1=F() 52 f1.test() 53 print(F.__mro__) #只有新式才有这个属性可以查看线性列表,经典类没有这个属性 54 # (<class '__main__.F'>, <class '__main__.D'>, <class '__main__.B'>, <class '__main__.E'>, <class '__main__.C'>, <class '__main__.A'>, <class 'object'>) 55 56 #新式类继承顺序:F->D->B->E->C->A 57 #经典类继承顺序:F->D->B->A->E->C 58 #python3中统一都是新式类 59 #pyhon2中才分新式类与经典类