python中super用法

这篇具有很好参考价值的文章主要介绍了python中super用法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

  在python继承的时候经常会遇到super这个东西,搞得不是太明白,写下这篇博文记录一下。我这里用的是python3版本。

一. super是什么

先来看下super是什么,怎么用的,具体后面介绍?

  • super是一个内置函数,用于调用父类(超类)的方法。它提供了一种方便的方式来调用父类的方法,而不需要显式地指定父类的名称。
  • super函数通常在子类的方法中使用。当你在子类中重写一个方法时,可以使用super函数来调用父类的相同方法。这样可以在不破坏继承关系的前提下,扩展或修改父类的行为。
  • super函数接受两个参数:子类的类名和子类的实例,即 super(子类类名,self).__init__()它返回一个特殊的对象,该对象可以用于调用父类的方法。通过super函数返回的对象,可以在子类中直接调用父类的方法,而无需显式指定父类的名称。在python3中已经简化了这种写法:直接写成super().__init__()

看个例子

class ParentClass:
    def __init__(self):
        self.parent_var = 10

    def some_method(self):
        print("ParentClass method")


class ChildClass(ParentClass):
    def __init__(self):
        super().__init__()  # 调用父类的初始化方法
        self.child_var = 20


    def some_method(self):
        super().some_method()  # 调用父类的方法
        print("ChildClass method")

child_obj = ChildClass()
child_obj.some_method()

把上面的代码改成类名继承看下:

class ParentClass:
    def __init__(self):
        self.parent_var = 10

    def some_method(self):
        print("ParentClass method")


class ChildClass(ParentClass):
    def __init__(self):
        ParentClass.__init__(self)  # 调用父类的初始化方法
        self.child_var = 20

    def some_method(self):
        ParentClass.some_method(self)  # 调用父类的方法
        print("ChildClass method")


child_obj = ChildClass()
child_obj.some_method()

输出:

ParentClass method
ChildClass method

  通过对比可以看到通过super可以直接替代类名从而简便继承方式。其实super对于普通函数的继承很好理解,就是直接通过super().xxx()即可调用父类的方法。我们下面重点介绍下经常让人困惑的super().__init__()

二.super().__ init__ ()

  在理解super().__ init__ ()的时候也可以直接把他当做继承普通的函数一样,只不过这里是继承父类的构造函数。既然是继承父类的构造函数,那么在继承的时候同样出现一种现象,那就是重写(有些人叫覆盖,个人感觉叫做重写更严谨),重写顾名思义就是父类已经有了这个函数了,子类中又写了一遍。根据强龙不压地头蛇的原则,那么在使用的时候如果发生了重写,就要以子类的函数为准。看个例子:

class A:
    def __init__(self):
        print("调用A")

class B(A):
    def __init__(self):
        print("调用B")

b = B()

输出:

调用B

  上面的代码可以发现,虽然B继承了A,但是构造函数重写了,所以在调用实例化B的时候调用的还是B本身的构造函数,可以理解为父类的构造函数被覆盖了。如果我还想调用父类的怎么办呢,如果你能想到继承,说明你基本上已经明白了,我们直接看例子:

class A:
    def __init__(self):
        print("调用A")

class B(A):
    def __init__(self):
        super().__init__()
        print("调用B")

b = B()

输出:

调用A
调用B

再来看个稍微复杂点的例子:

class ParentClass:
    def __init__(self, x):
        self.parent_var = x

    def some_method(self):
        print("ParentClass method")


class ChildClass(ParentClass):
    def __init__(self, x, y):
        super().__init__(x)  # 继承父类的构造函数
        self.child_var = y


child_obj = ChildClass(10, 20)
print(child_obj.parent_var)  # 访问继承的父类属性
print(child_obj.child_var)  # 访问子类属性

输出:

10
20

子类中并没有parent_var这个属性,但是可以通过继承父类的构造函数获取到这个属性。

三. 继承顺序

  当发生多继承的时候他的顺序是什么样的,如下面的一段代码C这个子类在继承父类的初始化函数的时候到底继承的是A的还是B的?

class A:
    def __init__(self):
        print('A')


class B:
    def __init__(self):
        print('B')


class C(A, B):
    def __init__(self):
        print('C')
        super().__init__()

c = C()

我们看一下输出结果是什么:

C
A

  为什么输出的是C,A呢?这里涉及到Python中的菱形继承。菱形继承的原则是继承的两个父类时并列的。按照继承的父类从左至右的顺序查找的,如果在当前类中找到方法,就直接执行,不再进行搜索,如果没有找到就查找下一个继承的父类中是否有对应的方法,如果找到,就直接执行,不再搜索,如果找到最后一个类,还没有找到方法,程序报错。
根据上面的原则,我们来看一个复杂点的多继承:

class A:
    def __init__(self):
        print('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__()


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()

输出:

G
E
B
F
C
D
A

  根据输出结果可以看到G继承自E, F是并列的,初始化的时候不会先把E初始化完毕才初始化F。也可以通过Python自带的__mro__查看一下继承顺序:

print(G.__mro__)

输出:

(<class '__main__.G'>, <class '__main__.E'>, <class '__main__.B'>, <class '__main__.F'>, <class '__main__.C'>, <class '__main__.D'>, <class '__main__.A'>, <class 'object'>)

至此关于super的基本介绍就已经讲完了,如有错误,敬请指正!文章来源地址https://www.toymoban.com/news/detail-732633.html

到了这里,关于python中super用法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • python3开发-Word助手

    目录 背景 思路 步骤 代码示例 总结 在日常工作和学习中,我们经常需要处理Word文档,例如编辑、提取内容、生成报告等。而Python是一门功能强大的编程语言,它提供了丰富的库和工具,使得我们可以利用Python来处理Word文档,并进行自动化操作。本文将介绍如何使用Python3开

    2024年02月12日
    浏览(38)
  • Python3(二):开发工具 IDEA配置

    因为一直使用IDEA进行Java开发,对IDEA相对熟悉,上手比较快,所以就选择了IDEA进行相关的Python脚本编写。当然也可以选择vsCode,PyCharm等工具。 本文主要介绍IDEA配置及如何创建Python项目。 选择本地安装的Python环境即可。 File - Project,选择Project SDK,一路Next,然后设置项目名

    2024年02月16日
    浏览(58)
  • Python之Web开发初学者教程—ubuntu中配置python3

    ubuntu 默认安装了 python 3.6.9 安装后默认不识别 python 命令,需要在 bin 下创建创建链接 同理: pip3 符号链接为 pip 安装 pyinstaller 如果 python 的环境已经配置好了,一行代码便可实现 pyinstaller 的安装。在 cmd 中输入 (pip3 是 python3 安装 ) pip3 install pyinstaller -i http://mirrors.aliyun.com/p

    2024年03月16日
    浏览(76)
  • 记录移植Python3到arm开发板linux系统中

    开发板情况 arm板是公司采购的工控机。主要用来 使用python3解析excel表格处理数据。 配置如下: 配置 版本 cpu imx6dl(armv7架构) 操作系统 linux3.10 python版本 2.7 项目情况 项目中最好使用 python3 。可行的有以下几种方式: 方式 优缺点 可行度 重做文件系统 订制程度比较高,后期增

    2024年02月04日
    浏览(51)
  • Python3 网络爬虫开发实战 第2版 (崔庆才) PDF 高清

    《Python 3 网络爬虫开发实战(第二版)》是由崔庆才所著的一本关于使用 Python 进行网络爬虫开发的书籍。 网络爬虫基础:介绍网络爬虫的基本概念、工作原理和常见的应用场景。 HTTP 协议与 Scrapy 框架:解释 HTTP 协议的基本知识,以及如何使用 Scrapy 框架来构建和管理爬虫项

    2024年04月09日
    浏览(78)
  • python的super函数详解

    用于类继承的super函数介绍 目录 python基础知识 一、super函数的用途 二、了解super函数的基本信息 三、多继承不重复调用  四、多继承重复调用 总结 一、super函数的用途 (1)避免在改动父类名称时还需改动子类调用方法的代码 (2)在子类中按照一套内置的顺序自动调用父类

    2024年02月12日
    浏览(32)
  • 安装anaconda3,并搭建一个python3.10开发环境【AI深度学习环境搭建】

    安装anaconda3,并搭建一个python3.10开发环境 1.打开conda官方下载地址 https://repo.anaconda.com/archive/,找到Anaconda3-2023.03-1-Windows-x86_64.exe 下载按默认方式安装到你目标盘。 2.打开安装好的Anaconda Powershell Prompt 执行 conda env list   查看本地的conda环境 (base) PS C:UsersAdministrator  conda env

    2024年02月08日
    浏览(56)
  • 性能的极致,Rust的加持,Zed-Dev编辑器快速搭建Python3.10开发环境

    快就一个字,甚至比以快著称于世的Sublime 4编辑器都快,这就是Zed.dev编辑器。其底层由 Rust 编写,比基于Electron技术微软开源的编辑器VSCode快一倍有余,性能上无出其右,同时支持多人编辑代码。 Zed.dev编辑器还在灰度测试阶段,暂时只释出了Mac版本,在Zed.dev官网下载,安装

    2024年01月20日
    浏览(62)
  • Python中的super:调用父类的构造方法

     在子类构造方法中调用父类构造方法的两种方式: 1、未绑定的方法: 直接使用父类名来进行调用 ,即‘父类名.父类方法名(self,[参数1, 参数2,...])’ 2、 super() : 如果涉及多继承,该函数只能调用第一个直接父类的构造方法。super().父类方法名(self, [参数1, 参数2,...])或supe

    2024年02月15日
    浏览(59)
  • Python丨tkinter开发常用的29种功能用法(建议码住)

    在Python软件开发中,tkinter中command功能的作用是为按钮、菜单等组件绑定回调函数,用户操作该组件时会触发相应的函数执行。 本文涵盖了各种组件和功能: 1、为Button组件(按钮)绑定回调函数   2、为Checkbutton组件(多选择钮)绑定回调函数   3、为Radiobutton组件(单选择钮

    2024年02月06日
    浏览(87)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包