4. 覆盖

什么是覆盖

覆盖是指在有继承关系的类中,子类中实现了与基类同名的方法,在子类的实例调用该方法时,实际调用的是子类中的同名的方法,这种现象叫覆盖。

作用

示例

# 此示例示意覆盖的效果
class Student:
    def study(self):
        print("小学生学习!")

class Doctor(Student):
    def study(self):
        print("博士生学习!")

# s1 = Student()
# s1.study()

d1 = Doctor()
d1.study()

Student类内的 study 方法被覆盖(不会被调用)

子类显式调用基类的覆盖方法

子类对象显式调用基类方法的方式一:

基类名.方法名(实例,实际调用参数, ...)

子类对象显式调用基类方法的方式二:

super函数

函数
说明
super(cls, obj)
返回绑定超类的实例(要求obj必须为cls类型的实例)
super()
返回绑定超类的实例,等同于:super(class, 实例方法的第一个参数),必须用在方法内调用

作用

借助super() 返回的实例间接调用其父类的覆盖方法。

示例

# 此示例示意如何显示调用被覆盖的方法
class Student:
    def study(self):
        print("小学生学习!")

class Doctor(Student):
    def study(self):
        print("博士生学习!")
    def rest(self):  # 休息时间
        # self.study()
        # Student.study(self)
        super().study()

d1 = Doctor()
# d1.study()
# 在方法外部显式调用被覆盖的方法1(使用类调用):
# Student.study(d1)
# 在方法外部显式调用被覆盖的方法2(使用Super函数调用):
# super(Doctor, d1).study()
d1.rest()

示例

# 显式调用基类的初始化方法
class Human:
    def __init__(self, n, a):
        self.name, self.age = n, a
    def infos(self):
        print("姓名:", self.name)
        print("年龄:", self.age)

class Student(Human):
    def __init__(self, n, a, s=0):
        super().__init__(n, a)
        self.score = s
    def infos(self):
        super().infos()
        print("成绩:", self.score)

# h1 = Human('张三', 20)
# h1.infos()
s1 = Student("魏明择", 35, 100)
s1.infos()
视频讲解