千家信息网

Python中super方法的使用

发表于:2025-01-16 作者:千家信息网编辑
千家信息网最后更新 2025年01月16日,本篇内容主要讲解"Python中super方法的使用",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"Python中super方法的使用"吧!前言super(
千家信息网最后更新 2025年01月16日Python中super方法的使用

本篇内容主要讲解"Python中super方法的使用",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"Python中super方法的使用"吧!

前言

super() 的入门使用

在类的继承中,如果重定义某个方法,该方法会覆盖父类的同名方法,但有时,我们希望能同时实现父类的功能,这时,我们就需要调用父类的方法了,可通过使用 super 来实现,比如:

class Animal(object):    def __init__(self, name):        self.name = name    def greet(self):        print 'Hello, I am %s.' % self.name class Dog(Animal):    def greet(self):        super(Dog, self).greet()   # Python3 可使用 super().greet()        print 'WangWang...'

在上面,Animal 是父类,Dog 是子类,我们在 Dog 类重定义了 greet 方法,为了能同时实现父类的功能,我们又调用了父类的方法,看下面的使用:

>>> dog = Dog('dog')>>> dog.greet()Hello, I am dog.WangWang..

super 的一个最常见用法可以说是在子类中调用父类的初始化方法了,比如:

class Base(object):    def __init__(self, a, b):        self.a = a        self.b = b class A(Base):    def __init__(self, a, b, c):        super(A, self).__init__(a, b)  # Python3 可使用 super().__init__(a, b)        self.c = c
深入 super()

看了上面的使用,你可能会觉得 super 的使用很简单,无非就是获取了父类,并调用父类的方法。其实,在上面的情况下,super 获得的类刚好是父类,但在其他情况就不一定了,super 其实和父类没有实质性的关联。

让我们看一个稍微复杂的例子,涉及到多重继承,代码如下:

class Base(object):    def __init__(self):        print "enter Base"        print "leave Base" class A(Base):    def __init__(self):        print "enter A"        super(A, self).__init__()        print "leave A" class B(Base):    def __init__(self):        print "enter B"        super(B, self).__init__()        print "leave B" class C(A, B):    def __init__(self):        print "enter C"        super(C, self).__init__()        print "leave C"

其中,Base 是父类,A, B 继承自 Base, C 继承自 A, B,它们的继承关系如下:

     Base      /  \     /    \    A      B     \    /      \  /       C

现在,让我们看一下使用:

>>> c = C()enter Center Aenter Benter Baseleave Baseleave Bleave Aleave C

如果你认为 super 代表『调用父类的方法』,那你很可能会疑惑为什么 enter A 的下一句不是 enter Base 而是 enter B。原因是,super 和父类没有实质性的关联,现在让我们搞清 super 是怎么运作的。

MRO 列表

事实上,对于你定义的每一个类,Python 会计算出一个方法解析顺序(Method Resolution Order, MRO)列表,它代表了类继承的顺序,我们可以使用下面的方式获得某个类的 MRO 列表:

>>> C.mro()   # or C.__mro__ or C().__class__.mro()[__main__.C, __main__.A, __main__.B, __main__.Base, object]

那这个 MRO 列表的顺序是怎么定的呢,它是通过一个 C3 线性化算法 来实现的,这里我们就不去深究这个算法了,感兴趣的读者可以自己去了解一下,总的来说,一个类的 MRO 列表就是合并所有父类的 MRO 列表,并遵循以下三条原则:

  • 子类永远在父类前面

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

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

super 原理

super 的工作原理如下:

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

其中,cls 代表类,inst 代表实例,上面的代码做了两件事:

  • 获取 inst 的 MRO 列表

  • 查找 cls 在当前 MRO 列表中的 index, 并返回它的下一个类,即 mro[index + 1]
    当你使用 super(cls, inst) 时,Python 会在 inst 的 MRO 列表上搜索 cls 的下一个类。

现在,让我们回到前面的例子。

首先看类 C 的 init 方法:

super(C, self).__init__()

这里的 self 是当前 C 的实例,self.class.mro() 结果是:

[__main__.C, __main__.A, __main__.B, __main__.Base, object]

可以看到,C 的下一个类是 A,于是,跳到了 A 的 init,这时会打印出 enter A,并执行下面一行代码:

super(A, self).__init__()

注意,这里的 self 也是当前 C 的实例,MRO 列表跟上面是一样的,搜索 A 在 MRO 中的下一个类,发现是 B,于是,跳到了 B 的 init,这时会打印出 enter B,而不是 enter Base。

整个过程还是比较清晰的,关键是要理解 super 的工作方式,而不是想当然地认为 super 调用了父类的方法。

小结

事实上,super 和父类没有实质性的关联。
super(cls, inst) 获得的是 cls 在 inst 的 MRO 列表中的下一个类。

到此,相信大家对"Python中super方法的使用"有了更深的了解,不妨来实际操作一番吧!这里是网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

方法 面的 代表 顺序 代码 子类 实例 实质 实质性 关联 事实 事实上 例子 兴趣 内容 功能 原理 同时 就是 情况 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 云南九零后网络技术有限公司 云手机服务器管理平台 前端 软件开发环境 软件开发中间平台 高清的垃圾分类软件开发 江苏网络技术分类资费 网络安全及网络交友 产品经理做增长还是网络安全 vb数据库查询单引号 网络编程与数据库编程注意事项 城市网络安全培养中心 网络安全大赛第九季 软件开发工程师的职业价值观 公司数据库意义是什么 威纶通配方数据库具体地址 花都软件开发院校 王者荣耀 什么软件开发的 软件开发能考什么证 下面哪项不是数据库不安全因素 网络安全的英语作文句子高中 未来会诞生哪些软件开发项目 软件开发项目收获 流量服务器托管投资 云霄县睦歌网络技术工作室 易语言实时获取数据库数据 未转变者怎么做服务器管理员 科技人才政策数据库 中概科技互联网主题基金 服务器开放远程访问 聊天记录会一直保存在服务器上吗
0