Python3 方法覆盖与 super 函数详解

何川
何川
发布时间:2026-10-13 | 5人浏览过
原创

本文详细解析 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 函数的详解就是本文的全部内容,希望能对读者有所帮助,也欢迎大家继续支持本站。

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表