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


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

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

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

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

    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
    '''
  • 相关阅读:
    1007 正整数分组
    Review: JQuery
    Summary: DOM modification techniques
    B
    D
    C
    hdu5592 倒序求排列+权值线段树
    主席树入门——询问区间第k大pos2104,询问区间<=k的元素个数hdu4417
    二维前缀和好题hdu6514
    莫比乌斯反演理解
  • 原文地址:https://www.cnblogs.com/msj513/p/9837634.html
Copyright © 2020-2023  润新知