面向对象——继承——减少冗余代码的方式
继承关系,产生新类,就是为了使得产生新类的代码量最为少。
为了减少代码的产生,子类不但继承父类的属性,还可以继承父类的方法,但是有可能子类需要对父类的方法进行扩写,但是依旧想保留使用父类的方法。
为实现上述目标有两种方式:
方式一:指明需要重用的父类的函数名字,其实不存在关系
class OldBoyPeople: school ='oldboy'#父类属性公用 def __init__(self,name,age,gender): self.name = name self.age = age self.gender =gender #学生类 class Student(OldBoyPeople): #学校属性使用父类属性 #init方法需要使用 #学生类独有方法 def choose_course(self): print('%s 正在使用选课'%self.name) #老师类 class Teacher(OldBoyPeople): #学校属性使用父类属性 #init方法需要依照父类方法扩写 def __init__(self,name,age,gender,level,salaries): OldBoyPeople.__init__(self,name,age,gender)#将self对象作为参数,传给OldBoyPeople类的__init__方法 #再添加其他私有属性 self.level =level self.salaries =salaries def score(self,stu): print('%s老师正在给%s 打分'%(self.name,stu.name)) #生成一个学生对象 s1 = Student('msj','25','male') #使用学生类的方法s1的名称空间 print(s1.__dict__) s1.choose_course() #生成老师对象 t1 = Teacher('egon',18,'male',10,30000) #显示t1的名称空间 print(t1.__dict__) t1.score(s1) """ {'name': 'msj', 'age': '25', 'gender': 'male'} msj 正在使用选课 {'name': 'egon', 'age': 18, 'gender': 'male', 'level': 10, 'salaries': 30000} egon老师正在给msj 打分 """
方式二:使用super(OldBoyPeople,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 Student(OldBoyPeople): #学校属性使用父类属性 #init方法需要使用 #学生类独有方法 def choose_course(self): print('%s 正在使用选课'%self.name) #老师类 class Teacher(OldBoyPeople): #学校属性使用父类属性 #init方法需要依照父类方法扩写 def __init__(self,name,age,gender,level,salaries): # OldBoyPeople.__init__(self,name,age,gender)#将self对象作为参数,传给OldBoyPeople类的__init__方法 #使用super函数 super().__init__(name,age,gender) #再添加其他私有属性 self.level =level self.salaries =salaries def score(self,stu): print('%s老师正在给%s 打分'%(self.name,stu.name)) #生成一个学生对象 s1 = Student('msj','25','male') #使用学生类的方法s1的名称空间 print(s1.__dict__) s1.choose_course() #生成老师对象 t1 = Teacher('egon',18,'male',10,30000) #显示t1的名称空间 print(t1.__dict__) t1.score(s1) """ {'name': 'msj', 'age': '25', 'gender': 'male'} msj 正在使用选课 {'name': 'egon', 'age': 18, 'gender': 'male', 'level': 10, 'salaries': 30000} egon老师正在给msj 打分 """
演示super是依照mro的列表顺序检索
class C: def test(self): print('from C') super().test()#依照a1对象的mro列表查找,已经查找到B类中,找到执行B类中的test函数 #[<class '__main__.A'>, <class '__main__.C'>, <class '__main__.B'>, <class 'object'>] class B: def test(self): print('from B') class A(C,B): pass print(A.mro()) a1 =A()#先生成A类的对象, a1.test()#依照mro列表查找,C类中找到 ''' [<class '__main__.A'>, <class '__main__.C'>, <class '__main__.B'>, <class 'object'>] from C from B '''