• 面向对象特征:继承


    1什么是继承
        继承是一种新建类的方式,新建的类称之为子类,派生类,被继承的类称之为基类、父类、超类
        继承描述的是一种“遗传”的关系:子类可以重用父类的属性
       python中继承的特点:
            1. 子类可以遗传/重用父类的属性
            2. python中一个子类可以同时继承多个父类(多继承,单继承
            3. 在继承背景下去说,python中的类分为两种:新式类,经典类
         [新式类: 但凡继承了object的类,以及该类的子类...都是新式类
                    在python3中一个类即便是没有显式地继承任何类,默认就会继承object
                    即python3中所有的类都是新式类
                经典类:没有继承object的类,以及该类的子类...都是经典类
                    在python2中才区分新式类与经典类,
                    在python2中一个类如果没有显式地继承任何类,也不会继承object]
    2 为何要用继承
        重用父类的属性,减少类与类之间代码冗余
    3 如何用继承
     yi.利用继承来解决类与类之间代码冗余问题  [父类名.__init__(self,属性1,属性2,.....), super(当前类名,self).__init__(属性1,属性2,......)] 
                                                                            这种跟不依赖继承关系, 不自动传值         py3 super(),内默认帮你写了。特殊的对象 严格按照mro()确定父类.严格依赖继承,自动传值
      在子类派生的新方法中重用父类功能的方式一
      在子类派生的新方法中重用父类功能的方式二
     er.属性查找
      单继承(只有一条分支,一条查到黑)
      多继承(新式类,经典类)
    yi:
    [class OldboyPeople:
        school = 'Oldboy'
        def __init__(self,name,age,sex):
            self.name = name
            self.age = age
            self.sex = sex
    class OldboyStudent(OldboyPeople):
        # def __init__(self, name, age, sex, score=0):
        #     self.name = name
        #     self.age = age
        #     self.sex = sex
        #     self.score = score
         def choose_course(self):
            print('%s choosing course' % self.name)
    class OldboyTeacher(OldboyPeople):
        # def __init__(self,name,age,sex,level):
        #     self.name=name
        #     self.age=age
        #     self.sex=sex
        #     self.level=level
         def score(self,stu,num):
            stu.score=num                              ]
    # 在子类派生出的新方法中重用父类功能的方式一:
    # 指名道姓地引用某一个类中的函数
    # 总结:
    # 1. 与继承无关
    # 2. 访问是类的函数,没有自动传值的效果
    [[class OldboyPeople:
        school = 'Oldboy'
        def __init__(self,name,age,sex):
            self.name = name
            self.age = age
            self.sex = sex
    class OldboyStudent(OldboyPeople):
        def __init__(self, name, age, sex, score=0):
            OldboyPeople.__init__(self,name,age,sex)
            self.score = score
        def choose_course(self):
            print('%s choosing course' % self.name)
    class OldboyTeacher(OldboyPeople):
        def __init__(self,name,age,sex,level):
            OldboyPeople.__init__(self,name,age,sex)
            self.level=level
        def score(self,stu,num):
            stu.score=num                         ]]
     在子类派生出的新方法中重用父类功能的方式二:super()必须在类中用
    # 在python2中:super(自己的类名,自己的对象)
    # 在python3中:super()
    # 调用该函数会得到一个特殊的对象,该对象专门用来访问父类中的属性,!!!完全参照mro列表!!!!
    # 总结:
    # 1. 严格依赖继承的mro列表
    # 2. 访问是绑定方法,有自动传值的效果
    [[[ class OldboyPeople:
    #     school = 'Oldboy'
    #
    #     def __init__(self,name,age,sex):
    #         self.name = name
    #         self.age = age
    #         self.sex = sex
    #
    # class OldboyStudent(OldboyPeople):
    #     def __init__(self, name, age, sex, score=0):
    #         super(OldboyStudent,self).__init__(name,age,sex)
    #         self.score = score
    #
    #     def choose_course(self):
    #         print('%s choosing course' % self.name)
    #
    # class OldboyTeacher(OldboyPeople):
    #     def __init__(self,name,age,sex,level):
    #         super().__init__(name,age,sex)
    #         self.level=level
    #
    #     def score(self,stu,num):
    #         stu.score=num                         ]]]
    er: 涉及到经典类(py2)和新式类(py2,py3)
    (单继承)
    # 在单继承背景下属性的查找优先级:对象->对象的类->父类->父类.....
      (多继承)   
    分支继承:
    # 在多继承背景下属性的查找优先级:
    # 如果一个子类继承多个分支(多个分支没有共同继承一个非object的类)
    # 此时属性的查找优先级是:对象->对象的类->按照从左往右的顺序一个分支一个分支的找下去
     
    #菱形继承:
    # 新式类 : 广度优先查找,从左往右一个分支一个分支的查找,在最后一个分支才去查找顶级类
    # 经典类 : 深度优先查找,从左往右一个分支一个分支的查找,在第一个分支就查找顶级类
  • 相关阅读:
    [改善Java代码]使用构造块精炼程序
    [改善Java代码]若有必要,使用变长数组
    [改善Java代码]警惕数组的浅拷贝
    [改善Java代码]在明确的场景下,为集合指定初始容量
    [改善Java代码] 枚举项数量限定为64个以内
    [改善Java代码]多种最值算法,适时选择
    [改善Java代码]推荐使用枚举定义常量
    [改善Java代码]性能考虑,数组是首选
    [改善Java代码]用偶判断,不用奇判断
    [改善Java代码]break万万不可忘
  • 原文地址:https://www.cnblogs.com/3sss-ss-s/p/9505978.html
Copyright © 2020-2023  润新知