Python中super().__init__()的作用与多继承机制解析
本文深入解析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__()相关内容,请搜索本站往期文章或继续浏览后续文章,感谢大家的支持!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









