继承可以分为但继承,多继承。
1 继承的基本形式 2 class ParentClass1(object): #定义父类 3 pass 4 5 class ParentClass2: #定义父类 6 pass 7 8 class SubClass1(ParentClass1): #单继承,基类是ParentClass1,派生类是SubClass 9 pass 10 11 class SubClass2(ParentClass1,ParentClass2): #python支持多继承,用逗号分隔开多个继承的类 12 pass 13 14 15 16 17 print(SubClass1.__bases__) #显示他继承了几类 18 print(SubClass2.__bases__) 19 print(ParentClass1.__bases__)
经典类和新式类:
两者区别在python3中是没有区别的,都有有个继承,如果没定义继承,也会默认将object继承,都叫新式类。
两者的区别在python2才有区别,没有定义就是经典类,如果定义了继承就是新式类。
1 class Animal: 2 x=1 3 def __init__(self,name,age,sex): 4 self.name=name 5 self.age=age 6 self.sex=sex 7 # print('Animal.__init__') 8 def eat(self): 9 print('%s eat' %self.name) 10 11 def talk(self): 12 print('%s say' %self.name) 13 14 class People(Animal): 15 x=10 16 def __init__(self,name,age,sex,education): 17 Animal.__init__(self,name,age,sex) 18 self.education=education 19 # print('People.__init__') 20 21 def talk(self): 22 Animal.talk(self) 23 print('这是人在说话') 24 25 class Dog(Animal): 26 pass 27 class Pig(Animal): 28 pass 29 30 31 peo1=People('alex',18,'male','小学肄业') 32 print(peo1.__dict__) 33 peo1.talk() 34 print(peo1.x) 35 36 dog1=Dog('yuanhao',28,'male') 37 pig1=Pig('wupeiqi',18,'male') 38 39 40 print(peo1.name) 41 print(dog1.name) 42 print(pig1.name)
类的继承:
1 class OldboyPeople: 2 school = 'oldboy' 3 def __init__(self,name,age,sex): 4 self.name=name 5 self.age=age 6 self.sex=sex 7 8 def eat(self): 9 print('is eating') 10 11 class OldboyStudent(OldboyPeople): 12 def learn(self): 13 print('%s is learning' %self.name) 14 15 16 class OldboyTeacher(OldboyPeople): 17 def __init__(self,name,age,sex,salary,title): 18 OldboyPeople.__init__(self,name,age,sex) 19 self.salary=salary 20 self.title=title 21 22 def teach(self): 23 print('%s is teaching' %self.name) 24 25 26 yl_obj=OldboyStudent('yanglei',28,'female') 27 egon_obj=OldboyTeacher('egon',18,'male',3.1,'沙河霸道金牌讲师')
总结;
1,继承功能之一:解决类与类之间代码重复
2,继承是类与类之间的关系,是一种,什么是什么的关系
3,在子类派生出新的属性,以自己的为准。
4,在子类派生出新的方法内重用弗雷的功能的方式:指名道姓
eg:OldboyPeople.__init__
这种调用方法本身跟继承没有关系
继承实现的原理:
调用顺序:
单继承的话:如果执行的话先找自己的范围内,当没有的时候再去找父类。(就是不管怎么找,都是先从自身找齐)
1 #单继承 2 class A: 3 def f1(self): 4 print('A.f1') 5 6 def f2(self): 7 print('A.f2') 8 self.f1() #b.f1() 9 10 class B(A): 11 def f1(self): 12 print('B.f2') 13 14 15 b=B() 16 # b.f2=111111 17 b.f2()
多继承的话:
1 #多继承 2 class J: 3 def test(self): 4 print('J') 5 class A(J): 6 # def test(self): 7 # print('A') 8 pass 9 class E(J): 10 def test(self): 11 print('E') 12 pass 13 class H(J): 14 def test(self): 15 print('H') 16 17 class G(H): 18 def test(self): 19 print('G') 20 pass 21 class B(A): 22 # def test(self): 23 # print('B') 24 pass 25 class D(E): 26 def test(self): 27 print('D') 28 pass 29 class F(G): 30 def test(self): 31 print('F') 32 pass 33 class C(B,D,F): 34 # def test(self): 35 # print('C') 36 pass 37 38 c=C() 39 # c.test=1111 40 c.test() 41
#可以利用*.mro()来查看他的调用顺序
eg: print(c.mro())