Python3 方法覆盖与 super 函数详解
本文详细解析 Python3 中子类对父类方法的覆盖机制,以及如何使用 super 函数间接调用被覆盖的父类方法。通过自行车与电动车的示例,演示了参数修改后的覆盖行为,并重点讲解了在子类 __init__ 中显式调用父类初始化方法的必要性及 super() 的两种调用方式,帮助开发者理解继承体系中的方法调用顺序。
Python3 方法覆盖的基本概念
# 方法覆盖
在类的继承关系中,如果子类定义了一个与父类同名的方法,当通过子类实例调用该方法时,实际执行的是子类中定义的版本,这种现象称为方法覆盖(Override)。
通俗来说,就像小明继承了父亲的一辆自行车,但他对其进行改装变成了电动车。此后小明每次骑行时,实际使用的是改装后的电动车(尽管它仍具备脚蹬功能,后续示例将继续沿用此比喻)。
以下是一个简单的代码示例:
class Bicycle():
def run(self):
print('我是自行车的run方法')
class E_Bicycle(Bicycle): # 继承自行车
def run(self):
print('我是电动车的run方法')
b = Bicycle()
b.run()
e_b = E_Bicycle()
e_b.run()
运行上述代码,打印结果如下:
我是自行车的run方法
我是电动车的run方法
需要注意的是,方法覆盖的前提是方法名必须相同。在上述示例中,子类继承自父类,且重写了同名方法,仅改变了 print 语句的输出内容。
如果示例不够直观,我们可以稍作修改:
class Bicycle(object):
def __init__(self, name):
self.name = name
def run(self):
print('我是%s的run方法'%self.name)
class E_Bicycle(Bicycle): # 继承自行车
def __init__(self, name, age):
self.name = name
self.age = age
def run(self):
print('我是%s的run方法, 被主人改装%s年了'%(self.name, self.age))
b = Bicycle('自行车')
b.run()
e_b = E_Bicycle('电动车', 3)
e_b.run()
这里不仅改变了 name 属性的值,还引入了 age 参数。
那么,在子类中如何调用父类原有的方法或访问父类属性呢?
使用 super 函数调用父类方法
# super 函数 super(cls, obj) 用于返回绑定到超类的实例(注意:obj 必须是 cls 类型的实例)。 super 的主要作用:间接调用父类中被覆盖的方法。
以下是一个使用 super 函数的示例:
# 示意super函数间接调用父类中被覆盖的方法
class A:
def work(self):
print('A.work被调用')
class B(A):
'''B类继承A类'''
def work(self):
print('B.work被调用')
def super_work(self):
'''调用B类自己的work方法'''
self.work() # B.work被调用,调用自身类的方法,和调用属性一样
super(B, self).work() # A.work被调用, 借助super调用父类被覆盖的方法
super().work() # A.work被调用 这种必须在方法内使用 ,可以省略(自身类)参数
b = B()
# b.work() # B.work被调用,调自身的类
# super(B, b).work() # A.work被调用(使用super是调用B的父类)
# super().work() # RuntimeError: super(): no arguments 不知道调用谁,所以此种省略参数的只能在内部使用
b.super_work() # 以上懂了,这回也就懂了
显式调用父类初始化方法
显示调用基类的初始化方法:
当子类中实现了 __init__ 方法(双下划线的初始化方法)时,父类的构造方法默认不会被自动调用。此时,需要在子类中显式调用父类的初始化方法。
具体示例如下:
# 示意显示调用初始化方法
class Human:
def __init__(self, n, a):
self.name = n
self.age = a
print('Human初始化的方法被调用了')
def infos(self):
print('姓名', self.name)
print('年龄', self.age)
class Student(Human):
def __init__(self, n, a, s=0):
# super(Student, self).__init__(n, a) # 调用父类的初始化方法 复习上边讲的
super().__init__(n, a) # 调用父类的初始化方法 内部省略参数
self.score = s # 增加一个属性
print('Student的初始化方法被调用了')
def infos(self): # 方法的重写
super().infos() # 显示调用父类的方法
print('成绩是:', self.score)
s1 = Student('张三', 20, 80)
s1.infos()
打印结果如下:
Human初始化的方法被调用了
Student的初始化方法被调用了
姓名 张三
年龄 20
成绩是: 80

结合前文自行车与电动车的例子,改写代码如下:
class Bicycle(object):
def __init__(self, name):
self.name = name
def run(self):
print('我是%s的run方法'%self.name)
class E_Bicycle(Bicycle): # 继承自行车
def __init__(self, name, age):
super().__init__(name) # 调用父类的name属性
self.age = age
def run(self):
super().run() # 调用父类的run方法
print('被主人改装%s年了'%(self.age)
b = Bicycle()
b.run()
e_b = E_Bicycle('电动车', 3)
e_b.run()

本节内容到此结束。
以上关于 Python3 方法覆盖与 super 函数的详解就是本文的全部内容,希望能对读者有所帮助,也欢迎大家继续支持本站。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













