首页 > 编程语言 >Python中super()的运作机制

Python中super()的运作机制

时间:2023-09-27 18:58:39浏览次数:36  
标签:__ .__ Python self 运作 init mro super

Python中super()的运作机制:

super()的定义:

def super(cls, instance):
    mro = inst.__class__.mro()
    return mro[mro.index(cls) + 1]

mro(Method resolution order)是python在多继承类中查找目标函数的策略,其采用的是广度优先算法,可通过类的mro方法查看。如下方代码:

class Base():
    def __init__(self):
        print("this is base init")
class A(Base):
    def __init__(self):
        print("this is A init")
        super().__init__()

class B(Base):
    def __init__(self):
        print("this is B init")
        super().__init__()

class C(A,B):
    def __init__(self):
        print("this is C init")
        super(B, self).__init__()

print(C.mro())
c = C()
# 输出:
# [<class '__main__.C'>, <class '__main__.A'>, <class '__main__.B'>, <class '__main__.Base'>, <class 'object'>]
# this is C init
# this is base init

python根据mro顺序查找目标函数,而super则能实现“插队”效果,上述代码中,首先执行C的构造函数,输出“this is C init”,然后super(B, self)查找B类在C的mro中的位置,并返回它下一个位置的类(super()函数返回的是mro[mro.index(cls) + 1]),也就是Base类,之后执行Base的构造函数,输出“this is base”。

在python3中,super()会自动填充当前类和实例,使用super(Class_name, self).__init__()和直接使用super().__init__()的效果是一样的。

标签:__,.__,Python,self,运作,init,mro,super
From: https://www.cnblogs.com/yang-ding/p/17733424.html

相关文章

  • pipreqs:Python导出项目依赖包
    许多教程使用的是pipfreeze>requirements.txt指令,但是这个指令只能检索当前虚拟环境中安装的包。要想自动检索项目文件中的依赖包要使用pipreqs,使用方法如下:首先安装pipreqspipinstallpipreqs使用在项目根目录下执行命令pipreqs./#生成requirements.txtpip......
  • 赛事星平台的作答脚本Python实现(适用于刷时间)
    灵感来源:白嫖某文理的一次答题竞赛,前一百名有奖品正好缺个蓝牙耳机索性就刷个时间白嫖一波吧.咳咳,正式开始分享咯.准备工作:谷歌浏览器以及自带开发者工具页面分析:由于此次白嫖活动已经结束,就采用其他竞赛URL进行分析,原理相同.URL:https://saishi.cnki.net/MatchInde......
  • python基础:模块和包
    一模块和包我们常常编辑保存的py文件就是一个个模块,模块名就是文件名不要后缀.py包是模块的集合,也可以将包看作一个目录,但该目录必须包含文件__init__.py(该文件可为空或有其它内容),python才会将该目录当作包来处理二模块和包的导入1模块的导入(1)导入形式1importmodule......
  • ArcGIS Pro 3创建Python环境失败的解决方法
    当使用ArcGISPro的包管理器创建新的Python环境时,遇到以下错误提示,无法成功创建。permissionError:[Errno13]Permissiondenied:'C:\\ProgramFiles\\ArcGIS\\Pro\\bin\\Python\\envs\\arcgispro-py3\\etc\\jupyter\\jupyter_notebook_config.json'解决方法:重启ArcGISPro......
  • Python桌面可视化+自动登录学校教务系统(含源码!!!)
    前言:通过Python爬虫与tkinter模块实现桌面快捷自动化登录教务系统效果展示:整体思路:创建主界面,在界面中手动输入用户名和密码,点击登录后自动打开浏览器,截取整个页面,裁剪出登录页面中的图片验证码并保存到本地,对验证码图片进行处理,识别出验证码。将用户名,密码,验证码一同自动输入到对......
  • Python学习笔记2
    defdouble(a):"""两倍处理三个引号可以多行注释,3个单引号也可以用来多行注释"""returna*2a=double(5)print(a)ifisinstance(a,int):#检测是否是某个类型print("a是整数")print(True+1)#True为1print(False+1)......
  • python numpy 计算1-10000 平方 立方 执行效率
    importsysfromdatetimeimportdatetimeimportnumpyasnpimportmatplotlib.pyplotasplt#使用NumPy计算defnumpysum(n):a=np.arange(n)**2b=np.arange(n)**3c=a+breturnc#使用Python计算#并这里由于源码为Python2的,python3中rang......
  • python装饰器执行顺序
    Python的装饰器是应用的函数或方法的特殊类型改变,它们会在被装饰的函数或方法被调用时执行。你可以使用多个装饰器来装饰一个函数,装饰器的执行顺序与它们应用的顺序有关。#使用两个装饰器装饰一个函数@decorator1@decorator2deffunc():pass在上述代码中,首先应用的......
  • python爬取手机壁纸
    无聊随便玩玩,要爬成功还早着呢,代码很乱可以整理,写了就记录一下吧,有机会再改。importrequestsimportosfrombs4importBeautifulSoupfromrequests.packagesimporturllib3importrandomimportthreadingimporttimeurllib3.disable_warnings()start_page=1end_......
  • Python工具箱系列(四十三)
    tar文件操作tar命令是Unix/Linux平台用的最多的命令之一。原始的tar只具备打包和解包的功能:TapeARchive,本义就是把文件打包备份到磁带机。GNU为tar增加了很多新功能,比如支持各种压缩格式。在Unix中一切都是文件:普通文件,文件夹,符号链接,设备文件等等。tar包就是由一个个文件顺序排......