千家信息网

python super()函数怎么使用

发表于:2025-01-17 作者:千家信息网编辑
千家信息网最后更新 2025年01月17日,这篇文章主要介绍"python super()函数怎么使用",在日常操作中,相信很多人在python super()函数怎么使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家
千家信息网最后更新 2025年01月17日python super()函数怎么使用

这篇文章主要介绍"python super()函数怎么使用",在日常操作中,相信很多人在python super()函数怎么使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答"python super()函数怎么使用"的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

Python是一门面向对象的语言,定义类时经常要用到继承,在类的继承中,子类继承父类中已经封装好的方法,不需要再次编写,如果子类如果重新定义了父类的某一方法,那么该方法就会覆盖父类的同名方法,但是有时我们希望子类保持父类方法的基础上进行扩展,而不是直接覆盖,就需要先调用父类的方法,然后再进行功能的扩展,这时就可以通过super来实现对父类方法的调用。

super的用法

看下面一个例子:

class A:    def func(self):        print("A的func执行")class B(A):    def func(self):        super().func()        print("B扩展的func执行")b = B()b.func()

# 输出结果为:
# A的func执行
# B扩展的func执行

上面程序中,A是父类,B是A的子类,我们在A类中重定义了func()方法,在B类中重新定义了func()方法,在方法中通过super().func()又调用了父类的方法,所以执行结果才会有A类func()方法输出。

如果经常看Python内置库及第三方库源码的话,你会发现,super用的非常多的地方是在子类中调用父类的初始化__init__()方法,这种用法非常常见。

class A:    def __init__(self, x):        self.x = xclass B(A):    def __init__(self, x, y):        super().__init__(x)        self.y = yb = B(1, 2)print(b.x, b.y)

看到这,你会想到super就是用来获取父类并用来调用父类方法的,这样说对不对呢,其实是不对的,使用supper获取的不是父类,而是MRO列表中的下一个类,所谓MRO列表即方法解析顺序(Method Resolution Order)列表,它代表着类继承的顺序,我们可以使用以下几种获得某个类的MRO列表:

C.mro()C.__mro__c.__class__.__mro__

MRO列表的顺序确定经历了很多次的变迁,最新的是通过C3线性化算法来实现的,感兴趣的话可以自行了解一下,总的来说,一个类的MRO列表就是合并所有父类的MRO列表,并遵循以下三条原则:

  • 子类永远在父类前面

  • 如果有多个父类,会根据它们在列表中的顺序被检查

  • 如果对下一个类存在两个合法的选择,选择第一个父类

下面来看一下下面这个例子:

class A(Base):    def func(self):        print("A的func执行")        super().func()        print("A的func执行完毕")class B(Base):    def func(self):        print("B的func执行")        super().func()        print("B的func执行完毕")class C(A, B):    def func(self):        print("C的func执行")        super().func()        print("C的func执行完毕")c = C()c.func()# 获取MRO列表print(c.__class__.__mro__)

执行结果如下:

上述程序中,Base是父类,A、B都继承自Base,C继承自 A、B,它们的继承关系就是一个典型的菱形继承,如下:

通过结果我们可以看出,super并不是获取父类并用来调用父类的方法,而是根据MRO列表一次调用下一个类,使用c.__class__.__mro__可以获取MRO列表,MRO列表的顺序是C、A、B、Base、object。

super的原理

super计算方法解析顺序中的下一个类,可以接收两个参数:

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

到此,关于"python super()函数怎么使用"的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注网站,小编会继续努力为大家带来更多实用的文章!

方法 子类 顺序 函数 结果 学习 就是 不对 两个 例子 更多 程序 而是 帮助 输出 选择 合法 接下来 兴趣 典型 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 乡镇网络安全工作应急预案 联想软件开发上海待遇 长春先进网络技术服务推荐咨询 cas管理多个服务器 初始化数据库直接启动怎么解决 服务器抢修费用使用说明 诚信的hmi软件开发 云顶名胜世界做网络安全 保苗网络安全课 erp服务器磁盘空间满了 警校的网络技术属于公安专业吗 手机上爱数服务器设置怎么弄 王者荣耀匹配是一个服务器的吗 信息安全 网络安全学科 数据库管理的工作流程 最牛的网络安全认证 我的世界体验服好玩儿的服务器 中子多球谱仪 解谱软件开发 gitee 本地服务器 济宁职业技术学院计算机网络技术 中文分词 数据库 db2数据库查询当月所有日期 实用教程阿里云服务器配置使用 网络安全局是个什么单位呢 信息技术与网络安全期刊 惠州租房软件开发 王者荣耀匹配是一个服务器的吗 环保服务器安全加固 我的世界手游版有外国服务器吗 群晖第三方kms服务器套件
0