资讯专栏INFORMATION COLUMN

5分钟了解 Python 中的super函数是如何实现继承的

psychola / 2312人阅读

摘要:和中有一个很大的区别就是类,无论是类的定义还是类的继承。中类的继承可以直接使用关键字代替原来的。中注释掉了函数,所以并没有向后继续执行。如果中仍然有函数则会继续向上去查找中是否有函数。

Py 2.x 和 Py 3.x 中有一个很大的区别就是类,无论是类的定义还是类的继承。Py 3.x 中类的继承可以直接使用 super() 关键字代替原来的 super(Class, self)。

那么 super() 到底是依据什么来继承的呢?今天就来分析下。

super()函数根据传进去的两个参数具体作用如下:

通过第一参数传进去的类名确定当前在MRO中的哪个位置。MRO(Method Resolution Order);

通过第二个参数传进去的self,确定当前的MRO列表。

def super(cls, inst):
   mro = inst.__class__.mro() #确定当前MRO列表
   return mro[mro.index(cls) + 1] #返回下一个类

如下代码:

class A(object):
    def name(self):
        print("name is xiaoming")    
        #super(A,self).name()

class B(object): 
    def name(self):
        print("name is cat")
      
class C(A,B):
    def name(self):
        print("name is wang")
        super(C,self).name()if __name__ == "__main__":

c = C()
print(c.__class__.__mro__)
c.name()

执行以上代码输出:当执行C类下的super()函数时,实际调用了A类下的name函数。A中注释掉了super()函数,所以并没有向后继续执行。并且打印出了当前MRO列表顺序为C,A,B,object.

(, , , )name is wangname is xiaoming

当我们把A类中的注释去掉后,执行代码输出:可以看到,当A执行后继续执行了B中的name()函数。如果B中仍然有super函数则会继续向上去查找object中是否有name()函数。

(, , , )name is wangname is xiaomingname is cat

关注公众号:「Python专栏」,后台回复「腾讯架构资源1」,获取由腾讯架构师整理的大数据学习资源包全套!!!

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/43287.html

相关文章

  • Python标准库---6、内置函数(P-K-R-S-T-U)

    摘要:上一篇文章标准库内置函数下一篇文章标准库内置函数内置函数返回一个新的对象,可以选择带有从获取的元素。推荐使用内置函数来检测对象的类型,因为它会考虑子类的情况。上一篇文章标准库内置函数下一篇文章标准库内置函数 上一篇文章:Python标准库---5、内置函数(P-K-R)下一篇文章:Python标准库---7、内置函数(V-W-X-Y-Z) 内置函数: showImg(https://...

    lastSeries 评论0 收藏0
  • ES6,你不得不学!

    摘要:但是,的本质仍然是函数,是构造函数的另外一种写法。报错原生构造函数的继承对于一些原生的构造函数,比如,,,等,在是无法通过方法实现原生函数的内部属性,原生函数内部的无法绑定,内部属性获得不了。 在没有学习 ES6 之前,学习 React,真的是一件非常痛苦的事情。即使之前你对 ES5 有着很好的基础,包括闭包、函数、原型链和继承,但是 React 中已经普遍使用 ES6 的语法,包括 ...

    CKJOKER 评论0 收藏0
  • 30分钟掌握ES6/ES2015核心内容(上)

    摘要:以下简称是语言的下一代标准。的继承机制,实质是先创造父类的实例对象所以必须先调用方法,然后再用子类的构造函数修改。总结以上就是最常用的一些语法,可以说这的语法,在的日常使用中占了追加十分钟好的吗分钟掌握核心内容下 ECMAScript 6(以下简称ES6)是JavaScript语言的下一代标准。因为当前版本的ES6是在2015年发布的,所以又称ECMAScript 2015。 也就是说...

    YPHP 评论0 收藏0
  • 广州三本找Java实习经历

    摘要:广州三本大三在读,在广州找实习。这篇文章其实主要是记录一下自己的面试经历,希望大家看完之后能有所了解进入中小公司究竟需要什么水平。时间复杂度尽量低一些使用快排的,将给出的随机数做基准值返回的坐标就是了。 前言 只有光头才能变强 这阵子跑去面试Java实习生啦~~~我来简单介绍一下背景吧。 广州三本大三在读,在广州找实习。大学开始接触编程,一个非常平庸的人。 在学习编程时,跟我类似的人应...

    enali 评论0 收藏0
  • 30分钟掌握ES6/ES2015核心内容

    摘要:以下简称是语言的下一代标准。因为当前版本的是在年发布的,所以又称。用它所声明的变量,只在命令所在的代码块内有效。的继承机制,实质是先创造父类的实例对象所以必须先调用方法,然后再用子类的构造函数修改。 ECMAScript 6(以下简称ES6)是JavaScript语言的下一代标准。因为当前版本的ES6是在2015年发布的,所以又称ECMAScript 2015。 也就是说,ES6就是E...

    LucasTwilight 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<