• 面向对象之继承


    1、什么是继承

    • 继承是一种新建类的方式,新建的类称之为子类或派生类,继承的父类称之为基类或超类

    • 在python中,一个子类可以继承多个父类

      其他语言中,一个子类只能继承一个父类

    2、继承的作用

    • 减少代码的冗余

    3、如何实现继承

    • 先确定谁是子类,谁是父类
    class ParentClass1:  # 定义父类
        pass
    
    class ParentClass2:  # 定义父类
        pass
    
    class SubClass1(ParentClass1):  # 单继承,基类是ParentClass1,派生类是SubClass
        pass
    
    class SubClass2(ParentClass1, ParentClass2):  # python支持多继承,用逗号分隔开多个继承的类
        pass
    

    4、查看所有继承的父类

    print(Person.__bases__) #__base __只查看从左到右继承的第一个父类,__bases__则是查看所有继承的父类

    如果没有指定父类,python会默认继承object类,object是所有python的父类。

    经典类:在python2中,class Dad: 不会继承object,这样的类叫做经典类(它叫经典类,不是因为它经典,而是因为它比较老)

    新式类:在python3中,python会默认继承object类(一切皆对象)

        class Dad 就相当于python2中的 class Dad(object) #新式类

    而且python3中没有经典类了

    5.继承与抽象(先抽象后继承)

    抽象:抽取类似或者说比较像的部分(也就是提取一类事物的特点,范围越来越大,共性越来越少)

        是从大范围到小范围的过程

    继承:是基于抽象的过程,通过编程语言去实现它,肯定是先经历抽象这个过程,才能通过继承的方式去表达出抽象的结构

       是从小范围到大范围的过程

    6.派生:(相对论)

      1.在父类的基础上产生子类,产生的子类就叫做派生类

      2.父类里没有的方法,在子类中有了,这样的方法就叫做派生方法。

      3.父类里有,子类也有的方法,就叫做方法的重写(就是把父类里的方法重写了)

    7.注意的几个概念:

      1.子类可以使用父类的所有属性和方法

      2.如果子类有自己的方法,就执行自己的;如果子类没有自己的方法,就会找父类的。

      3.如果子类里面没有找到,父类里也没有找到,就会报错

      4.如果子类中实现了调用父类的方法

        在类内:super(子类,self).方法名() supper().__init__(参数)

        在类外:super(子类名,对象名).方法名()

    8、super

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

    问题: 子类重写父类的__init__导致代码更加冗余

    解决问题: 子类重用父类的属性,并派生出新的属性。
    两种方式:
    1.直接引用父类的__init__为其传参,并添加子类的属性。
    2.通过super来指向父类的属性。

    super()是一个特殊的类,调用super得到一个对象,该对象指向父类的名称空间。

    ​ 注意: 使用哪一种都可以,但不能两种方式混合使用。

    方式一:

    方式一:
    class OldboyPeople:
        school = 'oldboy'
        def __init__(self, name, age, sex):
            self.name = name
            self.age = age
            self.sex = sex
    
    class OldboyTeacher(OldboyPeople):
        def __init__(self, name, age, sex, sal):
            OldboyPeople.__init__(self, name, age, sex)
            self.sal = sal
    

    方式二:

    class OldboyPeople:
        school = 'oldboy'
    
        def __init__(self, name, age, sex):
            self.name = name
            self.age = age
            self.sex = sex
    
    class OldboyTeacher(OldboyPeople):
        def __init__(self, name, age, sex, sal):
            # super() ---> 特殊的对象 ---> 对象.属性 ---> 父类的名称空间
            # 会将调用类传入的对象当做第一个参数传给__init__()
            super().__init__(name, age, sex)
            self.sal = sal
    

    class TTT:
    
        def __init__(self) -> None:
            self.a = '333'
    
    class GGG(TTT):
    
        def __init__(self) -> None:
            super(GGG, self).__init__()  # super(GGG,self) 首先找到 GGG 的父类(就是类 TTT),然后把类 GGG 的对象转换为类 TTT 的对象
    
        def t(self):
            print(self.a)
    
    
    run = GGG()
    run.t()
    

    用mro返回的是一个继承序列;(了解知识点)

    ​ super的继承顺序严格遵循mro继承序列

    9、钻石继承

    新式类:广度优先,横着找

    经典类:深度优先:从上到下找

  • 相关阅读:
    P6057 [加油武汉]七步洗手法
    LC 1349. Maximum Students Taking Exam (Hungarian / Max Flow)
    P1879 [USACO06NOV]玉米田Corn Fields
    P1433 吃奶酪 (TSP)
    LC 1349. Maximum Students Taking Exam
    获取XML中的值
    TimeZoneInfo类的使用
    XML 克隆节点
    网络协议概述:物理层、连接层、网络层、传输层、应用层详解
    Vuex
  • 原文地址:https://www.cnblogs.com/kai-/p/11935855.html
Copyright © 2020-2023  润新知