• Python基础之面向对象:3、继承与派生


    面向对象

    一、三大特征之继承

    • python三大特征:

      • 封装、继承、多态
    • 三者中继承最为核心,实际应用多,感受较为直观

    • 封装和多态略微抽象

    image

    1、继承的概念

    继承的含义:

    ​ 在现实生活中,继承表示人与人之间资源的从属关系

    ​ 例如:儿子继承父亲

    ​ 在编程的世界中,继承表示类与类之间的资源从属关系

    ​ 例如:类a继承类b

    继承的目的:

    ​ 在现实生活中,儿子继承了附件就拥有了父亲所有资源的支配权限

    ​ 在编程世界中,类A继承了类B就拥有了类B中所有的数据和方法使用权限

    2、继承的本质

    ​ 继承本质应该分为两部分:

    ​ 当多个类中含有相同部分时,我们就把相同的部分抽离出去,将相同的部分新成一个新的类,在用刚才被抽离出去相同部分的类,去继承新的那部分,这样的好处就是,当多个类需要一个相同用的功能时,可以节省代码,不用反复编写

    ​ 抽象:将多个类相同的东西抽出去,形成一个新的类

    ​ 继承:将多个类继承刚刚抽取出来的新的类

    对象>>>:数据与功能的结合体

    类(子类)>>>:多个对象相同功能和数据的结合体

    父类>>>:多个子类相同功能和数据的结合体


    本质:类、父类的本质都是为了节省代码,减少重复编写相同代码的时间,使用时更为方便

    image

    3、继承的实操

    • 在定义类的时候,类名后方可加括号,早括号内填入其他它类的名字,就意味着继承了其它类

    • python支持多类继承,括号内可填写多个类名,只需用逗号隔开即可

    # 1、定义两个类,其中一个假设为父类,另一个假设为子类
    class Father: 
        money = 99999999
        house = '老北京四合院'  # 父类中数据强大
    
    class Son:
        pass  # 子类中空空如也
    
    
    # 2、父类中的数据,子类无权直接使用,当我们在子类中继承父类后,子类和子类产生的对象都可以通过'点'的方式使用父类中的数据
    class Father:
        money = 99999999
        house = '老北京四合院'
    
    
    class Son(Father):
        pass
    
    # 子类直接使用父类中的数据
    print(Son.money)
    # 子类产生的对象使用父类中的数据
    obj1 = Son()
    print(obj1.money)
    ------------------------------------------------------------------------------------
    99999999
    99999999
    

    4、继承后名字查找的顺序

    未继承:

    ​ 对象(object)自身名称空间>>>类的名称空间

    单线继承:

    ​ 对象(object)自身名称空间>>>子类的名称空间>>>父类的名称空间

    多线继承:

    ​ 1、菱形继承: (广度优先,最后才会找闭环的定点)

    ​ 对象自身名称空间>>>子类名称空间>>>父类名称空间(形参内由左至右)>>>闭环

    ​ 2、非菱形继承: (深度优先)

    ​ 对象自身名称空间>>>子类名称空间>>>父类名称空间(形参内由左至右)

    	在一个子类绑定多个父类时,名字的查找顺序可能比较难理解,针对这个问题,可以使用python中内置方法:mor()   
    	通过对象名点mor() 的方式,可以帮助我们查看名字的查找顺序
    

    image

    5、经典类与新式类

    经典类:

    ​ 不继承object的类或者其子类的类

    新式类:

    ​ 继承object或者其之类的类

    ​ 在python3中,只有新式类,所有类都默认继承object

    ​ 在python2中,区分经典类和新式类

    在以后我们定义类的时候,如果没有明确的父类,可以在类的括号内填入object,这样话能够提高我们代码的兼容性

    二、派生

    1、派生的概念

    ​ 派生是指,子类继承父类,派生出自己的属性与方法,并且重用父类的属性与方法

    2、派生的方法

    1.直接引用父类的__ init __为其传参,并添加子类属性

    ​ 缺点:代码重复率太高,浪费资源,时间

    class People:
        school = '清华大学'
        def __init__(self, name, sex, age):
            self.name = name
            self.sex = sex
            self.age = age
    
    class Teacher(People):
        def __init__(self, name, sex, age, title): #派生
            self.name = name
            self.sex = sex
            self.age = age
            self.title = title
        def teach(self):
            print(f'{self.name}是老师')
    
    obj = Teacher('lili','female', 28, '高级教师') 
    #只会找自己类中的__init__
    print(obj.name, obj.sex, obj.age, obj.title)  
    #lili female 28 高级教师
    

    2.通过super()来指向父类的属性

    ​ super()是一个特殊的类,在子类__ init __内调用super得到一个对象,该对象指向父类的名称空间

    class Teacher(People):
        def __init__(self, name, sex, age, title):
            super().__init__(name, age, sex)
            #调用的是绑定方法,自动传入self
            self.title = title
    	 def teach(self):
             print(f'{self.name}是老师')
                
                
    obj = Teacher('lili','female', 28, '高级教师') 
    

    注意:在python2中super 的使用需要完整地写成super(自己的类名,self),而在python3中可以简写为super()。

  • 相关阅读:
    PyQt 问题记录
    uni-app - 日期 · 时间选择器
    云原生之使用Docker部署Nas-Cab个人NAS平台
    MIPI I3C协议
    【latex】参考文献bbl错误,Package inputenc Error,Misplaced alignment
    TensorFlow入门(十六、识别模糊手写图片)
    主动免疫可信计算打造安全可信网络产业生态体系
    前端最新面试题(基础模块HTML/CSS/JS篇)
    LeetCode刷题系列 -- 32. 最长有效括号
    与AI对话的艺术:如何优化Prompt以获得更好的响应反馈
  • 原文地址:https://www.cnblogs.com/kangssssh/p/16855176.html