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 ...
随机推荐
- Android 热补丁实践之路
最新github上开源了很多热补丁动态修复框架,主要的大致有: https://github.com/dodola/HotFix https://github.com/jasonross/Nuwa h ...
- 一句python,一句R︱python中的字符串操作、中文乱码
先学了R,最近刚刚上手python,所以想着将python和R结合起来互相对比来更好理解python.最好就是一句python,对应写一句R. pandas可谓如雷贯耳,数据处理神器. 以下符号: = ...
- freemarker写select组件报错总结(三)
1.错误描述 <html> <head> <meta http-equiv="content-type" content="text/htm ...
- gplots heatmap.2和ggplot2 geom_tile实现数据聚类和热图plot
主要步骤 ggplot2 数据处理成矩阵形式,给行名列名 hclust聚类,改变矩阵行列顺序为聚类后的顺序 melt数据,处理成ggplot2能够直接处理的数据结构,并加上列名 ggplot_tile ...
- poj1417菜鸡的详细题解(希望能帮助到和我一样陷于本题的新手)
题意太麻烦就偷懒转载他人的题意..... 题意转载自http://blog.csdn.net/acm_cxlove/article/details/7854526 by---cxlove ...
- RobotFramework自动化测试框架的基础关键字(一)
1.1.1 如何搜索RobotFramework的关键字 有两种方式可以快速的打开RIDE的关键字搜索对话框 1.选择菜单栏Tools->Search Keywords,然后会出现 ...
- canvas实现水波纹效果
本文将会从水波的基本原理开始,详细讲解在canvas中模拟水波扩散,分析并计算水波的能量分布,并通过振幅模拟水波对图像的折射效果,最后实现水波特效. 水波基本原理 首先复习一波高中物理知识. 波是指振 ...
- JS实现全选功能
000. 开始 学习JS有一段时间了,最近看了一些JS练手的小demo实例,自己也尝试着用JS进行实现. 全选功能是在很多注册页面.获取用户兴趣爱好.让用户勾选一些选项等页面中常见的一种效果,主要有全 ...
- 关于hibernate中hql语句 case when的写法
java hql case when的用法 if(null == sorter){ hql.append(" order by m.mDate desc,case when m.mealTi ...
- webapi下的web请求
先看webapi提供的服务: [HttpPost] public ResultBaseModel SiteList(SiteModel param) { ResultBaseModel resultM ...