13. 继承

面向对象的编程语言支持在已有类的基础上创建新类,从而减少重复代码的编写。提供继承信息的类叫做父类(超类、基类),得到继承信息的类叫做子类(派生类、衍生类)。

例如,学生和老师都有姓名、年龄,都会吃饭、睡觉——这些是作为"人"的公共属性和行为。所以我们应该先定义人类,再通过继承,从人类派生出老师类和学生类。

python
class Person:
    """人"""

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

    def eat(self):
        print(f'{self.name}正在吃饭.')

    def sleep(self):
        print(f'{self.name}正在睡觉.')


class Student(Person):
    """学生"""

    def __init__(self, name, age):
        super().__init__(name, age)

    def study(self, course_name):
        print(f'{self.name}正在学习{course_name}.')


class Teacher(Person):
    """老师"""

    def __init__(self, name, age, title):
        super().__init__(name, age)
        self.title = title

    def teach(self, course_name):
        print(f'{self.name}{self.title}正在讲授{course_name}.')


stu1 = Student('白元芳', 21)
stu2 = Student('狄仁杰', 22)
tea1 = Teacher('武则天', 35, '副教授')
stu1.eat()
stu2.sleep()
tea1.eat()
stu1.study('Python程序设计')
tea1.teach('Python程序设计')
stu2.study('数据科学导论')

▶ 运行结果:

输出
白元芳正在吃饭.
狄仁杰正在睡觉.
武则天正在吃饭.
白元芳正在学习Python程序设计.
武则天副教授正在讲授Python程序设计.
狄仁杰正在学习数据科学导论.

继承的语法是在定义类的时候,在类名后的圆括号中指定当前类的父类。如果定义一个类的时候没有指定它的父类是谁,那么默认的父类是 object 类。object 类是 Python 中的顶级类,所有的类都是它的子类。

在子类的初始化方法中,我们通过 super().__init__() 来调用父类初始化方法,super 函数是 Python 内置函数中专门为获取当前对象的父类对象而设计的。子类除了可以通过继承得到父类提供的属性和方法外,还可以定义自己特有的属性和方法,所以子类比父类拥有的更多的能力。