用super也很久了,但是一直没有关注过他的原理。最近开始越来越多关注python更底层的实现和奇技淫巧。看到该方法越发使用得多所以也研究了一波

平时单继承可能是我们遇到最多的情况。无非就是类似情况。

class A(object):
def __init__(self, a, b):
print 'times gone away %s, %s' % (a, b) class B(A):
def __init__(self, a, b):
super(B, self).__init__(a, b) B(1, 2)
times gone away 1, 2

这个例子的类B继承了类A,然后在初始化方法里面调用了父类A的初始化方法并且传入了参数。

其实我想说就这个 例子来看。。这样也可以

class A(object):
def __init__(self, a, b):
print 'times gone away %s, %s' % (a, b) class B(A):
pass B(1, 2)

当然。调用父类初始化方法之后,我们依然在后面可以做一些 其他的操作,但是第二个例子就做不到了注意。

super看上去 也可以通过直接写父类A.__init__(self, a, b)来实现但是,当我们遇到多继承的时候情况就有所改变。super可以帮忙利用方法解析顺序(Method Resolution Order, MRO)列表来寻找按顺序顺着父类。在多继承的情况下,初始化循序并非我们所想的自底向上。

而是顺着mro列表从左到右。

B.mro()   # or C.__mro__ or C().__class__.mro()
[<class '__main__.B'>, <class '__main__.A'>, <type 'object'>]

如上所示有三种方法查看该类的mro顺序。

从上面返回的数组我们可以看到,从顺序上看是B到A到 object的继承关系。

而super方法调用的本质是:

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

我们将类名cls 和实例self传入,然后由mro找到自己的类位置并且+1 返回下个继承类调用位置。 而不是自底向上的寻找父类。 有这个公式可能就更容易明白了。

preference的这篇文章举了一个 完整的多继承例子,但是我觉得 只要你理解了 python中寻找父类的方法不是自底向上 而是依赖mro算法的话,这样就不难理解了。

Reference:

https://segmentfault.com/a/1190000007426467  Python: 你不知道的 super

super 使用以及原理的更多相关文章

  1. python: super原理

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

  2. super的实例及实现原理

    super实例 class A(): def go(self): print ("go A go!") def stop(self): print ("stop A st ...

  3. self和super之间的区别

    关于 self 和 super 之间的区别, 首先要了解  1, self  是什么 :super 是什么.2,[ super init] 做什么.3,为什么要 self =  [super init ...

  4. python中super()的一些用法

    在看python高级编程这本书的时候,在讲到super的时候,产生了一些疑惑,super在python中的用法跟其他的语言有一些不一样的地方,在网上找了一些资料,发现基本上很少有文章能把我的疑惑讲明白 ...

  5. Python super使用

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

  6. Python: 你不知道的 super

    https://segmentfault.com/a/1190000007426467 Python: 你不知道的 super 在类的继承中,如果重定义某个方法,该方法会覆盖父类的同名方法,但有时,我 ...

  7. Python super() 函数

    super() 函数是用于调用父类(超类)的一个方法. super 是用来解决多重继承问题的,直接用类名调用父类方法在使用单继承的时候没问题,但是如果重定义某个方法,该方法会覆盖父类的同名方法,但有时 ...

  8. 转载 你不知道的super

    http://funhacks.net/2016/11/09/super/ super仅被用于新式类 在类的继承中,如果重定义某个方法,该方法会覆盖父类的同名方法,但有时,我们希望能同时实现父类的功能 ...

  9. python中super的使用

    转自:http://python.jobbole.com/86787/ super() 的入门使用 在类的继承中,如果重定义某个方法,该方法会覆盖父类的同名方法,但有时,我们希望能同时实现父类的功能, ...

随机推荐

  1. oracle 12C ORA-07445 12.1.0.2.0

    Mon Jun 11 14:06:23 2018 Exception [type: SIGSEGV, SI_KERNEL(general_protection)] [ADDR:0x0] [PC:0xC ...

  2. shell编程之测试和判断

    一.测试 程序运行中经常需要根据实际情况来运行特定的命令或代码段.比如判断某个文件或目录是否存在,如果文件或目录不存在,可能首先创建文件或目录.举例说,要判断文件/var/log/mlocate文件是 ...

  3. ASP.NET 文件操作类

    1.读取文件 2.写入文件 using System; using System.Collections.Generic; using System.IO; using System.Linq; us ...

  4. Ubuntu触摸屏校准

    我是在ubuntu系统中使用触摸屏,我的是两块屏幕一个是触摸屏幕一个是普通的屏幕,触摸屏使用需要校准,所以要直接入一个触摸屏,或者两个屏幕是复制的关系,不能是扩展. 1.安装已下的两个软件,有可能第一 ...

  5. eclipse 如何引入本地dtd

    一.首先修改xml的打开方式为:XML editor 1.菜单:Window -> Preferences ->General -> Editors -> File  Asso ...

  6. 有哪些操作会使用到TempDB;如果TempDB异常变大,可能的原因是什么,该如何处理(转载)

    有哪些操作会使用到TempDB:如果TempDB异常变大,可能的原因是什么,该如何处理:tempdb的用途: 存储专用和全局临时变量,不考虑数据库上下文: 与Order by 子句,游标,Group ...

  7. POJ3301 Texas Trip 计算几何、随机化贪心

    传送门--Vjudge 三分写法似乎有问题,可以去Udebug上看Morass的\(666\)个测试点的数据,我的乱搞有很多比正解答案小,但还是能在SPOJ和POJ过,可见数据之水. 可以对正方形的角 ...

  8. 马加爵遗书 VS 药家鑫遗书

          前言:今天是贰零壹柒年最后一个工作日,亦是2017年12月29日,因为明天就放元旦假了,公司同事比往常相对轻松些.中午吃完午饭,在办公室大家有说有笑,有人说姓马的人都挺牛X啊,比如:马云, ...

  9. ES7 之 Async/await 的使用

    在 js 异步请求数据时,通常,我们多采用回调函数的方式解决,但是,如果有多个回调函数嵌套时,代码显得很不优雅,维护成本也相应较高. ES6 提供的 Promise 方法和 ES7 提供的 Async ...

  10. python中使用pymongo操作mongo

    MongoDB是由C++语言编写的非关系型数据库,是一个基于分布式文件存储的开源数据库系统,其内容存储形式类似JSON对象,它的字段值可以包含其他文档.数组及文档数组,非常灵活.在这一节中,我们就来看 ...