面向对象——继承——减少冗余代码的方式

继承关系,产生新类,就是为了使得产生新类的代码量最为少。

为了减少代码的产生,子类不但继承父类的属性,还可以继承父类的方法,但是有可能子类需要对父类的方法进行扩写,但是依旧想保留使用父类的方法。

为实现上述目标有两种方式:

方式一:指明需要重用的父类的函数名字,其实不存在关系

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
'''

 

posted @ 2018-10-23 16:51  msjaxuexi  阅读(387)  评论(0编辑  收藏  举报