深入理解Python中super().__init__()的作用与用法

[id_[id_216178656]121071227]

深入理解Python中super().__init__()的作用与用法

[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、完整代码

你可能想看:
« 上一篇
下一篇 »

相关推荐

python爬虫教程PDF,Python爬虫书PDF

2026年09月02日

31阅读

外国教程python,python编程教学视频

2026年09月02日

25阅读

python简明教程沈洁元,python详细基础教程

2026年09月02日

21阅读

python库包教程,python 包

2026年09月02日

27阅读

python教程大全集,python教程600集

2026年09月02日

26阅读

python入门教程完整版,python零基础入门全套教程视频

2026年09月02日

22阅读