当一个类继承自另一个类,它就被称为一个子类/派生类,继承自父类/基类/超类。它会继承/获取所有类成员(属性和方法)。

继承能让我们重新使用代码,也能更容易的创建和维护应用。Python支持如下种类的继承:

单继承:一个类继承自单个基类 多继承:一个类继承自多个基类 多级继承:一个类继承自单个基类,后者则继承自另一个基类 分层继承:多个类继承自单个基类 混合继承:两种或多种类型继承的混合

多继承

python的类分为两种类型: 经典类(python2的默认类)和新式类(python3的默认类),经典类在继承的时候采用深度优先的顺序,而新式类的继承顺序则采用广度优先(从左到右)的顺序。

新建四个类(A, B, C, D),其中B和C都继承了A,而D继承了B和C。

新式类继承顺序:D->B->C->A, 广度优先,从左到右。

super方法

通常情况下,我们在子类中定义了和父类同名的方法,那么子类的方法就会覆盖父类的方法。而super关键字实现了对父类方法的改写(增加了功能,增加的功能写在子类中,父类方法中原来的功能得以保留)。也可以说,super关键字帮助我们实现了在子类中调用父类的方法

先继承,再重构

如果我们只是简单的在子类Chinese中定义一个构造函数,其实就是在重构。这样子类就不能继承父类的属性了。所以我们在定义子类的构造函数时,要先继承再构造,这样我们也能获取父类的属性了。

      子类构造函数基础父类构造函数过程如下:

      实例化对象c ----> c 调用子类__init__()  ---- > 子类__init__()继承父类__init__()  ----- > 调用父类 __init__()

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def talk(self):
        print("person is talking....")


class Chinese(Person):
    def __init__(self, name, age, language):  # 先继承,在重构
        Person.__init__(
            self, name,
            age)  #继承父类的构造方法,也可以写成:super(Chinese,self).__init__(name,age)
        self.language = language  # 定义类的本身属性

    def walk(self):
        print('is walking...')


class American(Person):
    pass


c = Chinese('bigberg', 22, 'Chinese')

print(c.talk())

什么时候用?(场景)

当类之间有很大相似的功能,我们可以提取这些共通的功能做成基类,其他类直接调用基类即可,此时使用类的继承合理。 场景:医院有患者、医生,都属于人,都有吃饭、睡觉、年龄、性别等方法或特征,这样,我们可以先定义人的类(包含以上的方法和特征),那么我们在定义患者类和医生类的时候就可以直接继承人这个类。 或者可以这样理解,我们定义一个基本的人的类,患者和医生的类继承人的类,再在人这个类的基础上派生出各自的特征和方法。这种方式也可以称之为类的派生。

results matching ""

    No results matching ""