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

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

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

 posted on 2019-11-26 15:28  Rannie`  阅读(143)  评论(0编辑  收藏  举报
去除动画
找回动画