Python工程师必知:super()__init__()用法

在Python面向对象编程中,我们经常需要调用父类的构造函数,而调用父类构造函数的一种常用方法是使用super()函数,其搭配的关键字是__init__()函数。

一、super()函数的概念

super()函数用于调用父类中的方法,可以避免在子类实现中重复写出父类的方法名,实现了代码复用与维护的便利。

当父类中出现同名函数的时候,使用super()可以保证调用了正确的函数。这是因为super()会按照方法解析顺序(MRO)的顺序来查找父类中的方法,而不是在当前类中查找。

MRO是一种线性化的方法解析顺序,它定义了子类中的方法搜索顺序,每个类都有一个MRO列表,按照从左至右,深度优先的顺序排列。

class A:
    def __init__(self):
        print('调用A类构造函数')
        
class B(A):
    def __init__(self):
        super().__init__()
        print('调用B类构造函数')
        
b = B()

运行结果:

调用A类构造函数
调用B类构造函数

上例中,子类B继承自父类A,并在构造函数中调用了父类A的构造函数。在调用super().__init__()时,会调用父类A的构造函数,输出“调用A类构造函数”的信息,然后再执行自身的构造函数,输出“调用B类构造函数”的信息。

二、super()函数使用时应注意的问题

1. super()函数的参数

super()函数有两种常见的调用形式,一种是super(当前类名, self);另一种是super(父类名, 子类实例)。

第一种调用形式中,当前类名可以省略,直接传入self,Python解释器会自动根据当前类确定要调用的父类。

class A:
    def foo(self):
        print('调用A类方法')

class B(A):
    def foo(self):
        super().foo()

b = B()
b.foo()

运行结果:

调用A类方法

上例中,子类B继承自父类A,重写了foo方法,并在foo方法中使用super().foo()调用了父类A的foo方法。

第二种调用形式中,可以手动指定要调用的父类名称,Python解释器会根据该名称按照类的继承关系来确定要调用的父类。

class A:
    def foo(self):
        print('调用A类方法')

class B(A):
    def foo(self):
        super(A, self).foo()

b = B()
b.foo()

运行结果:

调用A类方法

上例中,子类B继承自父类A,重写了foo方法,并在foo方法中使用super(A, self).foo()调用了父类A的foo方法。

2. super()函数与多继承的关系

在多继承的情况下,使用super()函数调用的是MRO列表中的下一个类的方法,而不是当前类的父类的方法。

class A:
    def foo(self):
        print('调用A类方法')

class B:
    def foo(self):
        print('调用B类方法')

class C(A, B):
    def foo(self):
        super().foo()

c = C()
c.foo()

运行结果:

调用B类方法

上例中,子类C继承自父类A和B,并在foo方法中使用super().foo()调用了父类A和B的foo方法。在Python中,多继承使用DFS算法创建MRO列表。因此MRO列表中的顺序为[C, A, B, object],super()函数调用的是MRO列表中的下一个类的方法,即B类的foo方法。

三、总结

super()函数是Python中非常重要的一个函数,用于调用父类的方法。在使用时应注意其参数的传入方式,以及在多继承的情况下的使用。

合理使用super()函数可以提高代码的可读性、减少代码重复和维护成本,是每个Python工程师都需要掌握的基本技能。

原创文章,作者:AJVI,如若转载,请注明出处:https://www.506064.com/n/140637.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
AJVIAJVI
上一篇 2024-10-04 00:24
下一篇 2024-10-04 00:24

相关推荐

  • Python列表中负数的个数

    Python列表是一个有序的集合,可以存储多个不同类型的元素。而负数是指小于0的整数。在Python列表中,我们想要找到负数的个数,可以通过以下几个方面进行实现。 一、使用循环遍历…

    编程 2025-04-29
  • 如何查看Anaconda中Python路径

    对Anaconda中Python路径即conda环境的查看进行详细的阐述。 一、使用命令行查看 1、在Windows系统中,可以使用命令提示符(cmd)或者Anaconda Pro…

    编程 2025-04-29
  • Python周杰伦代码用法介绍

    本文将从多个方面对Python周杰伦代码进行详细的阐述。 一、代码介绍 from urllib.request import urlopen from bs4 import Bea…

    编程 2025-04-29
  • Python中引入上一级目录中函数

    Python中经常需要调用其他文件夹中的模块或函数,其中一个常见的操作是引入上一级目录中的函数。在此,我们将从多个角度详细解释如何在Python中引入上一级目录的函数。 一、加入环…

    编程 2025-04-29
  • Python计算阳历日期对应周几

    本文介绍如何通过Python计算任意阳历日期对应周几。 一、获取日期 获取日期可以通过Python内置的模块datetime实现,示例代码如下: from datetime imp…

    编程 2025-04-29
  • python强行终止程序快捷键

    本文将从多个方面对python强行终止程序快捷键进行详细阐述,并提供相应代码示例。 一、Ctrl+C快捷键 Ctrl+C快捷键是在终端中经常用来强行终止运行的程序。当你在终端中运行…

    编程 2025-04-29
  • Python字典去重复工具

    使用Python语言编写字典去重复工具,可帮助用户快速去重复。 一、字典去重复工具的需求 在使用Python编写程序时,我们经常需要处理数据文件,其中包含了大量的重复数据。为了方便…

    编程 2025-04-29
  • Python清华镜像下载

    Python清华镜像是一个高质量的Python开发资源镜像站,提供了Python及其相关的开发工具、框架和文档的下载服务。本文将从以下几个方面对Python清华镜像下载进行详细的阐…

    编程 2025-04-29
  • Python程序需要编译才能执行

    Python 被广泛应用于数据分析、人工智能、科学计算等领域,它的灵活性和简单易学的性质使得越来越多的人喜欢使用 Python 进行编程。然而,在 Python 中程序执行的方式不…

    编程 2025-04-29
  • 蝴蝶优化算法Python版

    蝴蝶优化算法是一种基于仿生学的优化算法,模仿自然界中的蝴蝶进行搜索。它可以应用于多个领域的优化问题,包括数学优化、工程问题、机器学习等。本文将从多个方面对蝴蝶优化算法Python版…

    编程 2025-04-29

发表回复

登录后才能评论