今日内容:
1.什么是继承?
在python中继承的特点?单继承&多继承
python2与python3在继承上的区别
2. 为何继承?
3. 如何继承
先抽象再继承
4.属性查找的顺序
5. 派生?
在子类派生出的新属性中如何重用父类功能的两种方式
6. 组合
" " "
1.什么说继承?
在程序中继承是一种新建类的方式,新创建的类称之为子类派生类,被继承的类称之为父类基类超类
继承描述的是一种遗传关系,子类可以重用父类的属性
2, 为何用继承?
减少类与类之间代码沉余的问题
3. 如何继承
先抽象再继承
" " "
在python中继承的特点?单继承&多继承
class parent1(object): pass class Sub1(parent1): pass class sub2(parent,parent2): pass print(Sub1._bases_) print(Sub2._bases_) print(parent1._bases_) print(parent2._bases_) x=2 class Foo: # x=1 pass obj=Foo() obj.x=3 print(obj.x)
python2与python3在继承上的区别
新式类:但凡继承object类的子类,以及该子类的子子类,.....都称之为新式类
经典类:没有继承object类的子类,以及该子类的子子类,......都称之为经典类
只有在python2中才区分新式类与经典类
新式与经典在属性查找上的区别???
在子类派生的新功能中如何重用父类的功能:
方式一:指名道姓地访问某一个类中的函数,与继承无关
class 0ldboypeople: school = 'oldboy' def_init_(self,name,age,gender): self.name = name self.age = age self.gendef = gender
def choose_course(self): print('%s is choosing course'%self.name)
class Oldboy Teacher(Oldboypeople): tea, 'egon',18,'male',10,3000 def_init_(self,name,age gender,level,salary): self.name = name self.age = age self.gender = geder Oldboypeople._init_(self,name,age,gender)
self,level=level
self,salary=salary
def score(self,stu,nam): stu.num=num print('老师'%s‘给学生’%s‘打分’%s’%(self.name,stu.name,num)) stu = Oldboystdent('kevin',38',male') #_init_(stu1,'kevin,'38,'male') print(stu._dict_) tea=,;egon',18,'male',10,3000) print(stu._dict_) print(stu.school) print(tea.school)
在单继承背景下,无论是新式类还是经典类属性查找顺序都一样
先obj->类->父类->....
class foo: def f1(self): print('Foo.f1') def f2(self): print('Fpp.f2') self,f1() #obj.f1() class Bar(Foo): def f1 (self): print('Bar.f1) obj=Bar() obj.f2()
在多类背景下,如果一个子类继承了多个分只,但是多个分只没有汇聚到一个非object类,无论是新式类还是经典类属性查找顺序都一样:
会按照从左到右的顺序一个分只一个分只的查找下去
class E: xxx='E' pass class F: xxx='F' pass class B(E): xxx='B' pass class C(F): xxx='C' pass class D: xxx='D' pass class A(B,C,D): xxx='A' pass obj A=() obj.xxx=111 print(obj.xxx) print(A.mro())
在多继承背景下,如果一个子类继承多了多个分只,但是多个分只最终汇聚到一个非object类
新式类:广度优先查找:->A->B->C->E->C->F->D->G->0bject
经典类: 深度优先找查找:obj->A->B->E->G->C->F->D
class G: xxx='G' class E(G): pass class F(G): xxx='E' passs class B(G) XXX='F' pass class B (E) XXX='B' pass class b(E): xxx='B' pass class C(F): xxx='C' pass class D(G): xxx='D' pass class A(B,C,D): xxx='A' pass print(A.mro())
在子类派生出的新功能中如何重用父类的功能:
方式一:指名道姓地访问某一个类中的函数,与继承无关
方式二:super(Oldboy Teacher,self),在python3中uper可以不传参数,调用该函数会得到一个特殊对象,该对象是专门用来访问父类中属性,、
调用:super 会严格参照类的mro列表依次查找属性 class OldboyTeacer(Oldboypeople): tae,'egon',18'male',10,3000 def _init_(self,name,age,gender) Oldboypeople._init_(self,name,) super(OldboyTeacher,self)._init_(name,age,gender) self.leve=level self.salary=salary def score(self,stu,num); stu.num=num print(‘老师%给学生%s’%(self.name.stu,name,num)) tea=OldboyTeacher('egon',18,'male',10,3000)#_init__ (tea,'egon',18',male',103000) print(tea._dict_) print(stu.school) A没有继承B, class A: def test(self): print('A.test') super().test() class B: def test(self): print('from B') class C(A,B): pass c=C() c.test() print(C.mro())