zoukankan      html  css  js  c++  java
  • 面向对象之继承

    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、钻石继承

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

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

  • 相关阅读:
    learnyou 相关网站
    hdu 3038 How Many Answers Are Wrong
    hdu 3047 Zjnu Stadium 并查集高级应用
    poj 1703 Find them, Catch them
    poj 1182 食物链 (带关系的并查集)
    hdu 1233 还是畅通工程
    hdu 1325 Is It A Tree?
    hdu 1856 More is better
    hdu 1272 小希的迷宫
    POJ – 2524 Ubiquitous Religions
  • 原文地址:https://www.cnblogs.com/kai-/p/11935855.html
Copyright © 2011-2022 走看看