Python中super().__init__()的作用与多继承机制解析

Theo
Theo
发布时间:2026-10-16| 4人浏览过
原创

本文深入解析Python中super().__init__()的核心作用,通过三个对比测试展示未使用super时父类属性无法继承的问题,以及使用super后成功调用父类构造函数的效果。同时对比Python 2与Python 3在super语法上的差异,并简述多继承中super跳过重复调用的资源优化机制。

在Python编程中,super().__init__()的具体用途是什么?

许多开发者对于Python中super().__init__()的实际作用存在困惑,未能完全理清其工作机制。

简单来说,super().__init__()用于调用父类的__init__方法。同样地,使用super()配合其他方法名,也可以继承父类的其他非构造方法。

Python super().__init__() 功能测试

测试一:尝试以下代码,在不使用super(A, self).__init__()的情况下,调用类A的父类Root的属性和方法(注意:Root的方法内部不对Root的数据进行二次操作)。


class Root(object):
    def __init__(self):
        self.x= '这是属性'

    def fun(self):
    	#print(self.x)
        print('这是方法')
        
class A(Root):
    def __init__(self):
        print('实例化时执行')

test = A()		#实例化类
test.fun()	#调用方法
test.x		#调用属性

运行结果如下:

Traceback (most recent call last):

实例化时执行

这是方法

File "/hom/PycharmProjects/untitled/super.py", line 17, in <module>

test.x # 调用属性

AttributeError: 'A' object has no attribute 'x'

从结果可以看出,此时父类的方法虽然继承成功且可以使用,但父类的属性并未被继承,因此无法直接访问。

测试二:尝试以下代码,在不使用super(A,self).__init__()的情况下,调用类A的父类Root的属性和方法(注意:Root的方法内部对Root的数据进行了二次操作)。


class Root(object):
    def __init__(self):
        self.x= '这是属性'

    def fun(self):
    	print(self.x)
        print('这是方法')
        
class A(Root):
    def __init__(self):
        print('实例化时执行')

test = A()		#实例化类
test.fun()	#调用方法
test.x		#调用属性

运行结果如下:

Traceback (most recent call last):

File "/home/PycharmProjects/untitled/super.py", line 16, in <module>

test.fun() # 调用方法

File "/home/PycharmProjects/untitled/super.py", line 6, in fun

print(self.x)

AttributeError: 'A' object has no attribute 'x'

可以看到报错情况与测试一相似,证实了在不使用super初始化父类的情况下,无法使用父类的属性。

测试三:尝试以下代码,加入super(A, self).__init__()后,调用类A的父类Root的属性和方法(注意:Root的方法内部对Root的数据进行了二次操作)。


class Root(object):
    def __init__(self):
        self.x = '这是属性'

    def fun(self):
        print(self.x)
        print('这是方法')


class A(Root):
    def __init__(self):
        super(A,self).__init__()
        print('实例化时执行')


test = A()  # 实例化类
test.fun()  # 调用方法
test.x  # 调用属性

输出结果如下:

实例化时执行

这是属性

这是方法

此时,类A已经成功继承了父类的属性。因此,super().__init__()的作用显而易见:它负责执行父类的构造函数,从而使我们能够访问父类的属性。

上述示例为单继承情况。在实际开发中,我们常遇到多继承场景,其用法类似。但与直接调用Root.__init__(self)相比,super()在继承链中会跳过重复的父类调用,从而节省系统资源。

关于super的其他用法,可参考以下资料:

super()的使用指南

Python 2与Python 3中super()的区别

Python 3.x 与 Python 2.x 的一个主要区别是:在 Python 3 中,可以直接使用 super().xxx 来替代 super(Class, self).xxx。

在Python 3中,直接写作 super().方法名(参数)。

在Python 2中,必须写作 super(父类,self).方法名(参数)。

示例如下:

Python 3写法:super().__init__()

Python 2写法:super(父类,self).__init__()

Python 3.x 代码实例:


class A:
     def add(self, x):
         y = x+1
         print(y)
class B(A):
    def add(self, x):
        super().add(x)
b = B()
b.add(2)  # 3

Python 2.x 代码实例:


#!/usr/bin/python
# -*- coding: UTF-8 -*-
 
class A(object):   # Python2.x 记得继承 object
    def add(self, x):
         y = x+1
         print(y)
class B(A):
    def add(self, x):
        super(B, self).add(x)
b = B()
b.add(2)  # 3

总结

至此,关于Python中super().__init__()的测试与理解介绍完毕。如需了解更多Python super().__init__()相关内容,请搜索本站往期文章或继续浏览后续文章,感谢大家的支持!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。