一、类的继承
二、基于继承解决类与类的代码冗余问题
三、在单继承背景下属性的查找
四、super的方法
一、类的继承
1.什么是继承?
在程序中继承是一种新建子类的方法的方式,新创建的类成为子类\派生类,被继承的类称之 父类\基类\超类,继承描述的是一种遗传关系,子类可以重用父类的功能和属性。2.为何用继承?
介绍类与类之间的代码冗余问题。3.如何继承?
先抽象在继承。class Parent1(object): passclass Parent2: passclass Sub1(Parent1):# 括号是被继承的类,称为父类 passclass Sub2(Parent1,Parent2): # 一个类可以继承多个类,中间逗号分开 pass# Sub1\Sub2,都可以访问父类的功能和属性print(Sub1.__bases__)print(Sub2.__bases__)# 返回被实例化的类名print(Parent1.__bases__)print(Parent2.__bases__)
4.python2与python3的区别?
新式类:但凡继承object类的子类,以及该子类的子子类,...都称之为新式类 经典类:没有继承object类的子类,以及该子类的子子类,...都称之为经典类只有在Python2中采取分新式类与经典类
二、基于继承解决类与类的代码冗余问题
在子类派生出的新功能张如何重用父类的功能:
指名道姓的访问某一个类中的函数,与继承无关
class OldboyPeople: school = "Oldboy" def __init__(self,name,age,gender): self.name=name self.age=age self.gender=genderclass OldboyStudent(OldboyPeople): def __init__(self,name,age,gender): super(OldboyStudent, self).__init__(name,age,gender) def choose_cour(self): print("%s is choose course"% self.name)class OldboyTeacher(OldboyPeople): def __init__(self,name,age,gender,level,salary): OldboyPeople.__init__(self,name,age,gender) self.level = level self.salary = salary def score(self,stu,num): stu.num = num print("老师%s 给学生 %s 打分%s"% (self.name,stu.name,num))yyh =OldboyStudent("yyh",18,"male")print(yyh.__dict__)OldboyStudent.choose_cour(yyh)egon = OldboyTeacher("egon",28,"women",10,"50k")print(egon.__dict__)egon.score(yyh,99)
三、在单继承背景下的属性查找
在单继承背景下,无论是新式类还是经典类属性查找顺序都一样
先obj--->类---->父类....在多继承背景下,如果一个类继承了多个分支,但是多个分支没有汇聚到一个非object
无论是新式类还是经典类属性查找顺序都是一样: 会按照从左到右的顺序一个一个分支的找下去在多继承背景下,如果一个子类继承了多个分支,当时多个分支最终汇聚到一个非onject类
(菱形继承问题)#新式类:广度优先查找:obj->A->B->E->C->F->D->G->object# 经典类:深度优先查找:obj->A->B->E->G->C->F->Dclass G: xxx='G'class E(G): xxx='E' passclass F(G): xxx='F' passclass B(E): xxx='B' passclass C(F): xxx='C' passclass D(G): xxx='D' passclass A(B,C,D): xxx='A' passprint(A.mro())
四、super方法
在子类派生出的新功能中如何重用父类的功能
方式一:指名道姓的访问某一类中的函数,与继承无关 方式二:super(OldboyTeacher,self),在python3中super可以不用传参数,调用该函数会得到 一个特殊的对象,该对象是专门用来访问父类中的属性。强调:super会严格参照类的mro列表依次查找属性
class OldboyPeople: school = "Oldboy" def __init__(self,name,age,gender): self.name=name self.age =age self.gender=gender class OldboyTeacher(OldboyPeople): def __init__(self,name,age,gender,level,salary): super(OldboyTeacher,self).__init__(name,age,gender) self.level=level self.salary=salary tea=OldboyTeacher("egon",18,"male",10,"50k") print(tea.__dict__)