Python中super()函数的执行顺序与继承机制解析
本文深入解析Python中super()函数的作用机制。通过代码案例说明,super()用于调用父类初始化方法,其执行时机决定了子类能否访问父类成员变量。文章指出,明确父类即引用了成员函数但未执行初始化,super()执行前无法访问父类成员变量,执行后才完成初始化并可访问成员变量。
技术背景
在Python中,super()函数通常被称为“超类”引用,其核心功能之一是调用父类的__init__初始化方法。由于Python支持单继承和多继承,对象创建时的执行顺序至关重要。本文将重点探讨super()的具体作用及其在继承体系中的行为。
案例测试
为了厘清super()的前后逻辑关系,我们设计如下测试案例:首先定义一个父类initial,该父类包含参数param和函数func;接着定义子类new继承自父类initial。在子类的__init__方法中,通过super调用父类逻辑,并在调用前后分别打印参数param的值以及函数func的返回值。相关代码如下所示:
# 定义父类
class initial(object):
def __init__(self):
print ('This print is from initial object')
# 定义父类参数
self.param = 3
# 定义父类函数
def func(self):
return 1
# 定义子类
class new(initial):
print ('This print is from new object')
# 打印子类函数值
print (self.func())
# 执行父类初始化函数
super(new, self).__init__()
# 打印父类参数值
print(self.param)
self.param = 4
# 定义子类函数
return 2
if __name__ == '__main__':
new()代码的执行结果如下所示:
This print is from new object 2 This print is from initial object 3
结果分析
观察输出结果可知,父类initial中__init__方法内的打印语句是在super()调用之后才输出的,这证实了super负责执行父类的初始化操作。那么,如果不调用super,子类new对父类initial的继承关系体现在何处?答案在于父类的成员函数。例如,在以下案例中:
class initial(object):
def __init__(self):
print ('This print is from initial object')
self.param = 3
def func(self):
return 1
class new(initial):
def __init__(self):
print ('This print is from new object')
print (self.func())
super(new, self).__init__()
print(self.param)
self.param = 4
if __name__ == '__main__':
new()我们移除了子类中重载的成员函数,得到的运行结果如下:
This print is from new object 1 This print is from initial object 3
可以看出,在调用super()之前,已经可以打印出父类func方法的返回值。这表明Python中继承的逻辑如下:

正因为必须执行super才能初始化父类中的成员变量,所以在super()调用之前,子类无法访问父类的成员变量。
总结概要
本文通过Python实际案例,讲解了面向对象技术中类的继承必用的super()函数逻辑。我们可以将Python类的继承过程理解为:当在类定义括号中指定父类时,已经引用了父类的成员函数,但并未执行父类的初始化函数。在子类初始化过程中,会检查是否重载了父类成员函数,若重载则直接覆盖。只有在执行super()之后,才相当于执行了父类的初始化函数,此时方可访问父类的成员变量。
版权声明
本文首发链接为:https://www.cnblogs.com/dechinphy/p/super.html
作者ID:DechinPhy
更多原著文章请参考:https://www.cnblogs.com/dechinphy/
打赏专用链接:https://www.cnblogs.com/dechinphy/gallery/image/379634.html
腾讯云专栏同步:https://cloud.tencent.com/developer/column/91958
到此这篇关于python中的super是什么?的文章就介绍到这了,更多相关python中的super内容请搜索本站以前的文章或继续浏览下面的相关文章希望大家以后多多支持本站!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









