深入理解Python中super().__init__()的作用与用法
[id_[id_216178656]121071227]

[id_1348991816]
super().__init__() 、 super(B,self).__init__()
python 中的 super().__init__()的作用是什么呢?有很多同学对此并不清楚。
super()的作用是调用父类(基类)的方法。__init__()是类所具有的构造方法。
super().__init__() 的作用是调用父类的 init 方法。并且,同样能够利用 super() 来调用父类的其他方法。
理解 __init__() 。
需要注意的是python2、3的super写法稍有不同。
1.2、__ init __()
__init__() 是 Python 中的一种函数。它在创建对象的时候会被调用。它是构造函数,会自动执行。
定义类时可以不写init方法,系统会默认创建,
你也可以写一个,让你的类在创建时完成一些“动作”。
1.3、super(). __ init __()
如果子类B和父类A,都写了init方法,
A 的 init 方法会被 B 所覆盖。若要调用 A 的 init 方法,需借助 super 来进行调用。
在 B 内部,一方面可以用 super 来调用父类的方法,另一方面也能够用父类名进行调用,例如:
class B(A):
def __init__(self):
A.__init__(self)
print("B init")
1.3.1、关于“覆盖”的疑问
有人或许会对“覆盖”的意思产生误解,觉得“覆盖”了就意味着不存在了,那为何还能够通过 super 进行调用呢?
A 的方法仍然存在,并没有因为被覆盖而消失。不过,需要在 B 内部通过 super 调用这些方法。
例:
A 中写了一个名为 hi()的方法。B 继承自 A,并且 B 中也写了一个名为 hi()的方法。
B 的对象若要进行外部调用 hi(),那么就仅能调用 B 内部所写的这个 hi()。
要通过 B 来调用 A 的 hi(),就只能在 B 的内部使用 super().hi()进行调用。
class A:
def hi(self):
print("A hi")
class B(A):
def hello(self):
print("B hello")
b = B()
b.hi() # B里没有写hi(),这里调用的是继承自A的hi()
------------------------------------------------------------------
class A:
def hi(self):
print("A hi")
class B(A):
def hi(self):
print("B hi")
b = B()
b.hi() # 这里调用的就是B自己的hi()
------------------------------------------------------------------
class A:
def hi(self):
print("A hi")
class B(A):
def hi(self):
super().hi() # 通过super调用父类A的hi()
print("B hi")
b = B()
b.hi() # 这里调用的就是B里面的hi()
2、super() 在 python2、3中的区别
Python3.x 与 Python2.x 存在一个区别,即 Python 3 能够直接使用 super().xxx 来替代 super(Class, self).xxx 。
例:
在 Python3 中,直接进行如下操作:使用 super().__init__() 。
在 Python2 中,需要写成这样的形式:使用 super(本类名, self).__init__() 。
Python3.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
Python2.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
3、关于继承顺序
最底层:先写一个父类A
class A:
def __init__(self):
print('A')
第二层:让 B、C、D 继承自A
class B(A):
def __init__(self):
print('B')
super().__init__()
class C(A):
def __init__(self):
print('C')
super().__init__()
class D(A):
def __init__(self):
print('D')
super().__init__()
第三层: E、F、G 继承
class E(B, C):
def __init__(self):
print('E')
super().__init__()
class F(C, D):
def __init__(self):
print('F')
super().__init__()
class G(E, F):
def __init__(self):
print('G')
super().__init__()
看看G的继承顺序
我们发现 G 是从 E 继承而来的,F 与 E 是并列的关系,在进行初始化操作时,不会先将 E 全部初始化完成之后再去初始化 F。
4、从多个实例中对比super(python3)
以下是三种不同的继承与调用方式,对比它们的差异,以明确 super().__init__()的用途。
4.1、实例
子类名称继承内容
Puple
继承所有
Puple_Init
继承,但覆盖了init方法
Puple_Super
继承了相关内容,同时覆盖了 init 方法,并且在 init 方法内部添加了 super().__init__()
4.2、运行结果与对比
4.3、完整代码