python中super()的一些用法
在看python高级编程这本书的时候,在讲到super的时候,产生了一些疑惑,super在python中的用法跟其他的语言有一些不一样的地方,在网上找了一些资料,发现基本上很少有文章能把我的疑惑讲明白,其中这篇文章最有价值的地方是它讲解了我们平时对super的正确使用方法。
首先看一段程序:
class A:
def __init__(self):
print("A", end=" ")
super().__init__()
class E:
def __init__(self):
print("E", end=" ")
super().__init__()
class B(E):
def __init__(self):
print("B", end=" ")
super().__init__()
class D:
def __init__(self):
print("D", end=" ")
super().__init__()
class C(A, B, D):
def __init__(self):
print("C", end=" ")
A.__init__(self)
D.__init__(self)
B.__init__(self)
print("MRO:", [x.__name__ for x in C.__mro__])
print(C())
这段程序的打印结果是:
MRO: ['C', 'A', 'B', 'E', 'D', 'object']
C A B E D D B E D <__main__.C object at 0x1040340b8>
这段程序可以简单演示super()的用法,比较简单的概念是__mro__,它告诉我们某个类的继承链信息,生成这个链的原则有两条:
- 在继承关系中,所有的子类都在父类前边
- 如果出现冲突,则按照其__base__排序
要想理解上边程序的打印结果,只需要知道super()其实它相当于super(cls, self),知道了这一点答案就很清晰了
当执行A.__init__(self)
这行代码的时候,self指向了c实例对象,然后打印出A,当调用super().__init__()
这行代码的时候,实际相当于super(A, self).__init__()
的调用, super(A, self)
的会在self.__mro__中查找排在A后边的类,这样就实现了继承链的调用了。
其实到了这里,我们基本上能猜到super()的实现原理了,虽然看上去它像没传入参数一样,其实不然,如果我们改变参数,找到的父类是不同的。
我们把上边代码中的A稍微改变一下:
class A:
def __init__(self):
print("A", end=" ")
super(D, self).__init__()
那么在这里super(D, self)
获取的就是object了,因此打印结果是:
MRO: ['C', 'A', 'B', 'E', 'D', 'object']
C A D B E D <__main__.C object at 0x1040340b8>
super()具有运行时特性,也就是说它的结果是动态计算出来的,利用这一点可以写出扩展性比较好的程序,同时,从编程语义也更符合生活习惯。目前能够总结的就是这样。
python中super()的一些用法的更多相关文章
- Python中super函数的用法
之前看python文档的时候发现许多单继承类也用了super()来申明父类,那么这样做有何意义? 从python官网文档对于super的介绍来看,其作用为返回一个代理对象作为代表调用父类或亲类方法.( ...
- python中super关键字的用法
http://python.jobbole.com/86787/ class A: def __init__(self): print "enter A" print ...
- Python中super的用法【转载】
Python中super的用法[转载] 转载dxk_093812 最后发布于2019-02-17 20:12:18 阅读数 1143 收藏 展开 转载自 Python面向对象中super用法与MRO ...
- python中super().__init__和类名.__init__的区别
super().__init__相对于类名.__init__,在单继承上用法基本无差 但在多继承上有区别,super方法能保证每个父类的方法只会执行一次,而使用类名的方法会导致方法被执行多次 多继承时 ...
- Python中 sys.argv[]的用法
Python中 sys.argv[]的用法 因为是看书自学的python,开始后不久就遇到了这个引入的模块函数,且一直在IDLE上编辑了后运行,试图从结果发现它的用途,然而结果一直都是没结果,也在网上 ...
- 31 Python中 sys.argv[]的用法简明解释(转)
Python中 sys.argv[]的用法简明解释 因为是看书自学的python,开始后不久就遇到了这个引入的模块函数,且一直在IDLE上编辑了后运行,试图从结果发现它的用途,然而结果一直都是没结果, ...
- Python中sorted()方法的用法
Python中sorted()方法的用法 2012-12-24 22:01:14| 分类: Python |字号 订阅 1.先说一下iterable,中文意思是迭代器. Python的帮助文档中对i ...
- Python中int()函数的用法浅析
int()是Python的一个内部函数 Python系统帮助里面是这么说的 >>> help(int) Help on class int in module __builti ...
- 解读typescript中 super关键字的用法
解读typescript中 super关键字的用法 传统的js,使用prototype实现父.子类继承.如果父.子类有同名的方法,子类去调用父类的同名方法需要用 “父类.prototype.metho ...
随机推荐
- 搜索引擎case︱从搜索序列文本看高端商务车︱统计之都
朱雪宁(北京大学光华管理学院) 王汉生(北京大学光华管理学院) 摘要:本文对100万搜索引擎用户的13亿搜索序列文本进行探索分析,对高端车用户以及商学院人群做了描述对比,并 ...
- xp+WinDBG+VMware调试内核
呵呵,搞点突兀的标题而已.其实说的还是如何使用WinDBG和VMware来搭建调试内核的环境而已,这些网上已经有数不清的教程了,不过我喜欢自己亲手写一下.第一,把这个过程写一遍能加深印象,就算以后忘记 ...
- Android4种网络连接方式HttpClient、HttpURLConnection、OKHttp和Volley优缺点和性能对比
比较的指标: 1.cpu 2.流量 3.电量 4.内存占用 5.联网时间 功能点: 1.重试机制 2.提供的扩展功能 3.易用性 4.是否https 5.是否支持reflect api,OkHttp有 ...
- insert ,update 以及merge 的使用
本次将用到的几个表,以及字段> emp表 empno, ename,job,mgr,hiredate,sal,comm,deptno > dept表 deptno,dname,loc &g ...
- Jqurey 得到url参数 getUrlParam
Jqurey 得到url参数 getUrlParam <script type="text/javascript"> (function ($) { //扩展方法获取u ...
- web开发性能优化---UI界面篇
1.尽量采用div+css布局 DIV+CSS相比较与表格布局的优势: a.代码精简 使用DIV+CSS布局,页面代码精简,这一点对XHTML有所了解的都知道.代码精简所带来的直接好处有两点:一是提高 ...
- ArgumentError: Error #1063: BasicChart/dataFunc() 的参数数量不匹配。应该有 2 个,当前为 3 个。
1.错误描述 ArgumentError: Error #1063: BasicChart/dataFunc() 的参数数量不匹配.应该有 2 个,当前为 3 个. at mx.charts.char ...
- 芝麻HTTP:Scrapy-Splash的安装
Scrapy-Splash是一个Scrapy中支持JavaScript渲染的工具,本节来介绍它的安装方式. Scrapy-Splash的安装分为两部分.一个是Splash服务的安装,具体是通过Dock ...
- lvy打包到本地
图解
- 6个重要的.NET概念: - 堆栈,堆,值类型,引用类型,装箱和拆箱(转)
今天在Code Project上面看到一篇文章<6 important .NET concepts: - Stack, heap, Value types, reference types, b ...