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函数
函数
说明
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()