怎么恢复红米手机的红米微信聊天记录恢复

深入解析Python编程中super关键字的用法
作者:j_hao104
字体:[ ] 类型:转载 时间:
Python的子类调用父类成员时可以用到super关键字,初始化时需要注意super()和__init__()的区别,下面我们就来深入解析Python编程中super关键字的用法:
官方文档中关于super的定义说的不是很多,大致意思是返回一个代理对象让你能够调用一些继承过来的方法,查找的机制遵循mro规则,最常用的情况如下面这个例子所示:
class C(B):
def method(self, arg):
super(C, self).method(arg)
子类C重写了父类B中同名方法method,在重写的实现中通过super实例化的代理对象调用父类的同名方法。
super类的初始方法签名如下:
def __init__(self, type1, type2=None): # known special case of super.__init__
super(type, obj) -& requires isinstance(obj, type)
super(type) -& unbound super object
super(type, type2) -& requires issubclass(type2, type)
Typical use to call a cooperative superclass method:
除去self外接受一个或者或者两个参数,如同注释声明的一样,接受两个参数时返回的是绑定的super实例,省略第二个参数的时候返回的是未绑定的super对象。
一般情况下当调用继承的类方法或者静态方法时,并不需要绑定具体的实例,这个时候使用super(type, type2).some_method就能达到目的,当然super(type, obj)在这种情况下也能够使用,super对象有自定义实现的getattribute方法也能够处理。不过,后者一般用来调用实例方法,这样在查找方法的时候能够传入相应的实例,从而得到绑定的实例方法:
class A(object):
def __init__(self):
@classmethod
def klass_meth(cls):
@staticmethod
def static_meth():
def test(self):
class B(A):
&&& b = B()
&&& super(B, b).test
&bound method B.test of &__main__.B object at 0x02DA3570&&
&&& super(B, b).klass_meth
&bound method type.klass_meth of &class '__main__.B'&&
&&& super(B, b).static_meth
&function static_meth at 0x02D9CC70&
&&& super(B, B).test
&unbound method B.test&
&&& super(B, B).klass_meth
&bound method type.klass_meth of &class '__main__.B'&&
&&& super(B,B).satic_meth
&&& super(B,B).static_meth
&function static_meth at 0x02D9CC70&
初始化super对象的时候,传递的第二个参数其实是绑定的对象,第一个参感觉数可以粗暴地理解为标记查找的起点,比如上面例子中的情况:super(B, b).test就会在B.__mro__里面列出的除B本身的类中查找方法test,因为方法都是非数据描述符,在super对象的自定义getattribute里面实际上会转化成A.__dict['test'].__get__(b, B)。
super在很多地方都会用到,除了让程序不必hardcode指定类型让代码更加动态,还有其他一些具体必用的地方比如元类中使用super查找baseclass里面的new生成自定义的类型模板;在自定义getattribute的时候用来防止无限循环等等。
关于super建议读者将它与python的描述符一起来理解,因为super就实现了描述符的协议,是一个非数据描述符,能够帮助大家更好的理解super的使用和工作原理。
同时,有以下4个点值得大家注意:
1、单继承时super()和__init__()实现的功能是类似的
class Base(object):
def __init__(self):
print 'Base create'
class childA(Base):
def __init__(self):
print 'creat A ',
Base.__init__(self)
class childB(Base):
def __init__(self):
print 'creat B ',
super(childB, self).__init__()
base = Base()
a = childA()
b = childB()
输出结果:
Base create
creat A Base create
creat B Base create
使用super()继承时不用显式引用基类。
2、super()只能用于新式类中
把基类改为旧式类,即不继承任何基类
class Base():
def __init__(self):
print 'Base create'
执行时,在初始化b时就会报错:
super(childB, self).__init__()
TypeError: must be type, not classobj
3、super不是父类,而是继承顺序的下一个类
&&& 在多重继承时会涉及继承顺序,super()相当于返回继承顺序的下一个类,而不是父类,类似于这样的功能:
def super(class_name, self):
mro = self.__class__.mro()
return mro[mro.index(class_name) + 1]
&&& mro()用来获得类的继承顺序。
class Base(object):
def __init__(self):
print 'Base create'
class childA(Base):
def __init__(self):
print 'enter A '
# Base.__init__(self)
super(childA, self).__init__()
print 'leave A'
class childB(Base):
def __init__(self):
print 'enter B '
# Base.__init__(self)
super(childB, self).__init__()
print 'leave B'
class childC(childA, childB):
c = childC()
print c.__class__.__mro__
输入结果如下:
Base create
(&class '__main__.childC'&, &class '__main__.childA'&, &class '__main__.childB'&, &class '__main__.Base'&, &type 'object'&)
&&& supder和父类没有关联,因此执行顺序是A —& B—&—&Base
&&& 执行过程相当于:初始化childC()时,先会去调用childA的构造方法中的 super(childA, self).__init__(), super(childA, self)返回当前类的继承顺序中childA后的一个类childB;然后再执行childB().__init()__,这样顺序执行下去。
&&& 在多重继承里,如果把childA()中的 super(childA, self).__init__() 换成Base.__init__(self),在执行时,继承childA后就会直接跳到Base类里,而略过了childB:
Base create
(&class '__main__.childC'&, &class '__main__.childA'&, &class '__main__.childB'&, &class '__main__.Base'&, &type 'object'&)
&&& 从super()方法可以看出,super()的第一个参数可以是继承链中任意一个类的名字,
&&& 如果是本身就会依次继承下一个类;
&&& 如果是继承链里之前的类便会无限递归下去;
&&& 如果是继承链里之后的类便会忽略继承链汇总本身和传入类之间的类;
&&& 比如将childA()中的super改为:super(childC, self).__init__(),程序就会无限递归下去。
File "C:/Users/Administrator/Desktop/crawler/learn.py", line 10, in __init__
super(childC, self).__init__()
File "C:/Users/Administrator/Desktop/crawler/learn.py", line 10, in __init__
super(childC, self).__init__()
File "C:/Users/Administrator/Desktop/crawler/learn.py", line 10, in __init__
super(childC, self).__init__()
File "C:/Users/Administrator/Desktop/crawler/learn.py", line 10, in __init__
super(childC, self).__init__()
File "C:/Users/Administrator/Desktop/crawler/learn.py", line 10, in __init__
super(childC, self).__init__()
File "C:/Users/Administrator/Desktop/crawler/learn.py", line 10, in __init__
super(childC, self).__init__()
File "C:/Users/Administrator/Desktop/crawler/learn.py", line 10, in __init__
super(childC, self).__init__()
File "C:/Users/Administrator/Desktop/crawler/learn.py", line 10, in __init__
super(childC, self).__init__()
File "C:/Users/Administrator/Desktop/crawler/learn.py", line 10, in __init__
super(childC, self).__init__()
File "C:/Users/Administrator/Desktop/crawler/learn.py", line 10, in __init__
super(childC, self).__init__()
File "C:/Users/Administrator/Desktop/crawler/learn.py", line 10, in __init__
super(childC, self).__init__()
File "C:/Users/Administrator/Desktop/crawler/learn.py", line 10, in __init__
super(childC, self).__init__()
File "C:/Users/Administrator/Desktop/crawler/learn.py", line 10, in __init__
super(childC, self).__init__()
RuntimeError: maximum recursion depth exceeded while calling a Python object
4、super()可以避免重复调用
&&& 如果childA基础Base, childB继承childA和Base,如果childB需要调用Base的__init__()方法时,就会导致__init__()被执行两次:
class Base(object):
def __init__(self):
print 'Base create'
class childA(Base):
def __init__(self):
print 'enter A '
Base.__init__(self)
print 'leave A'
class childB(childA, Base):
def __init__(self):
childA.__init__(self)
Base.__init__(self)
b = childB()
Base的__init__()方法被执行了两次
Base create
Base create
使用super()是可避免重复调用
class Base(object):
def __init__(self):
print 'Base create'
class childA(Base):
def __init__(self):
print 'enter A '
super(childA, self).__init__()
print 'leave A'
class childB(childA, Base):
def __init__(self):
super(childB, self).__init__()
b = childB()
print b.__class__.mro()
Base create
[&class '__main__.childB'&, &class '__main__.childA'&, &class '__main__.Base'&, &type 'object'&]
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具查看: 61180|回复: 234
发一个三刷LeetCode总结
精华主题学分
高级农民, 积分 2773, 距离下一级还需 2227 积分
在线时间 小时
注册一亩三分地论坛,查看更多干货!
才可以下载或查看,没有帐号?
二刷LeetCode之后看到论坛上的这个([Leetcode] ***重磅炸弹*** Leetcode for Dummy)深深被楼主的毅力所折服
于是乎为了避免机械重复,决定三刷LeetCode的时候自己也建一个类似的表格来做总结
现在为了攒人品决定把花了几个月的所有成果和地里的朋友们分享!!!
给大家数数都有些什么内容
题目总结,LeetCode.numbers:
纯英文,分为LeetCode Summary,Tips, New Free Problems,New Problems in Book以及Other Classic Problems每个题目有编号,Title,Difficulty,Tags,思路,关键代码,出现频率以及时间、空间复杂度Title加粗表示题目需要重点理解点击Title直接跳转到LeetCode对应的题目页面,十分方便!按照Frequency倒序排序可以看高频题,适合要迅速找手感的情况!思路和关键点里面重点标红,方便迅速掌握!Frequency从5到1,5是最高频,另外用 “-” 表示频率不一定Tips sheet总结了常见的解题方法155以后的题目归类在New Free Problems里,新题容易考,要单独准备!New Problems in Book是收费题,接下来会找时间更新Other Classic Problems会持续更新常见的面试题目,以Common为主,方便面试小公司!为了方便不用mac的朋友导出了一份excel,也在根目录下
代码部分:
全部免费题的代码,经过参考进一步整理以及优化,有注释,容易理解代码按难度分为Easy,Medium和Hard三个文件夹每个解答都有问题的Description和Tag,方便离线阅读大部分解答可以直接运行,有一些test cases,有多种解法
资源部分, Resources文件夹:
一个LeetCode Clean Code Handbook的问题列表,PDF不好直接分享,毕竟别人是在卖的LeetCode for dummy帖子当中的楼主总结excel文件
Database分类,按难度整理LeetCode OJ新加的数据库问题Other分类,整理LeetCode上没有的常见题目,保持同样格式,有Decription,Tag,注释以及不同解法
code preview.png (314.01 KB, 下载次数: 15)
09:09 上传
总结示例:
summary.png (146.66 KB, 下载次数: 44)
09:10 上传
那么灯灯灯等,重磅炸弹来了:
我就不设置下载之类的了,免得大家本来就少的可怜的米再受损失
我还在持续的更新,有很多地方不完善还请大家见谅,朋友们也可以star或者folk这个repo以便得到及时的更新
如果觉得好请赏点~让楼主也能读点高级帖子不至于揭不开锅啊!!!
<p id="rate_071" onmouseover="showTip(this)" tip="感谢分享!&大米 + 1 升
" class="mtn mbn">
<p id="rate_054" onmouseover="showTip(this)" tip="感谢分享!&大米 + 3 升
" class="mtn mbn">
<p id="rate_295" onmouseover="showTip(this)" tip="感谢分享!&大米 + 3 升
" class="mtn mbn">
<p id="rate_190" onmouseover="showTip(this)" tip="很有用的信息!&大米 + 10 升
" class="mtn mbn">
<p id="rate_903" onmouseover="showTip(this)" tip="感谢分享!&大米 + 3 升
" class="mtn mbn">
<p id="rate_424" onmouseover="showTip(this)" tip="感谢分享!&大米 + 3 升
" class="mtn mbn">
<p id="rate_349" onmouseover="showTip(this)" tip="感谢分享!&大米 + 5 升
" class="mtn mbn">
<p id="rate_330" onmouseover="showTip(this)" tip="感谢分享!&大米 + 10 升
" class="mtn mbn">
<p id="rate_716" onmouseover="showTip(this)" tip="很有用的信息!&大米 + 1 升
" class="mtn mbn">
<p id="rate_71" onmouseover="showTip(this)" tip="感谢分享!&大米 + 3 升
" class="mtn mbn">
<p id="rate_611" onmouseover="showTip(this)" tip="很有用的信息!&大米 + 1 升
" class="mtn mbn">
<p id="rate_017" onmouseover="showTip(this)" tip="感谢分享!&大米 + 3 升
" class="mtn mbn">
<p id="rate_416" onmouseover="showTip(this)" tip="感谢分享!&大米 + 10 升
" class="mtn mbn">
<p id="rate_607" onmouseover="showTip(this)" tip="很有用的信息!&大米 + 3 升
" class="mtn mbn">
<p id="rate_12" onmouseover="showTip(this)" tip="感谢分享!&大米 + 10 升
" class="mtn mbn">
本帖被以下淘专辑推荐:
& |主题: 87, 订阅: 138
& |主题: 14, 订阅: 36
& |主题: 13, 订阅: 7
& |主题: 19, 订阅: 3
精华主题学分
在线时间 小时
关注一亩三分地公众号:Warald_一亩三分地
谢谢大家的支持!
前段时间分享之后帖子就沉下去了,原以为不会再有很多关注
最近因为写毕业论文新出的三题还没有加上,周末会及时补上,以便更好的帮助大家
请大家关注我的Github!
精华主题学分
在线时间 小时
关注一亩三分地微博:Warald
楼主业界良心!!本人小白想问下,我看大家刷leetcode都是用JAVA的,不知道用JAVA的好处是什么呢?因为我只 ...
Java是有一些好处,比如说使用的比较广泛,语法比较易懂…
但面试的时候你可以用最熟悉的语言,面试官一般不会要求你一定用哪种语言解决问题,现在也有很多人喜欢用python。
面试最重要的三板斧之一是自证写在白板上的代码是正确的,如果面试官没看懂就解释到他满意为止。
精华主题学分
在线时间 小时
非常详细的分享,自己写一遍的效果比看别人的三五遍还要好。
这里也放上我自己刷题过程中的总结, http://algorithm.yuanbin.me Github Repo地址 /billryan/algorithm-excercise 欢迎大家star && Pull Request
精华主题学分
在线时间 小时
还在找工作需要内推的朋友可以关注一下这个帖子
Yahoo内推 2016Q2有效:/bbs/forum.php?mod=viewthread&tid=189642&fromuid=68465
补充内容 ( 12:11):
之前那个帖子审核没通过,链接应该是这个:
精华主题学分
在线时间 小时
自己先顶一下,绝对是业界良心!!!
精华主题学分
在线时间 小时
膜拜楼主大神!!!
精华主题学分
在线时间 小时
膜拜楼主大神!!!
过奖了啊,正是因为不是大神所以要下这样的功夫
希望也能帮到大家
精华主题学分
在线时间 小时
lz可以啊,可惜我用c++做啊,不过准备偶尔参考下
精华主题学分
在线时间 小时
lz可以啊,可惜我用c++做啊,不过准备偶尔参考下
我在看LeetCode Discuss的时候也会参考C++ code,觉得挺好的~
精华主题学分
在线时间 小时
LZ真业界良心!!顶起啊
精华主题学分
在线时间 小时
楼主业界良心啊!!!
精华主题学分
在线时间 小时
LZ真业界良心!!顶起啊
谢谢支持!
精华主题学分
在线时间 小时
楼主业界良心啊!!!
谢谢大家支持,希望对刷题的朋友们有帮助!
精华主题学分
在线时间 小时
多谢分享,已经从down下所有代码。。
精华主题学分
在线时间 小时
多谢分享,已经从down下所有代码。。
希望对你有帮助
最近又会更新一些东西,还是推荐大家star或者watch repo,及时得到最新内容!
有问题或者建议也可以发送pull request,一起改进、学习。
精华主题学分
在线时间 小时
佩服!这么完整的注释光敲出来也得不少功夫呢!LZ牛!
精华主题学分
在线时间 小时
佩服!这么完整的注释光敲出来也得不少功夫呢!LZ牛!
慢慢积累,每天做几题,挺好的~
精华主题学分
在线时间 小时
刚刚增加了Leetcode最新题目的代码和讲解:Repeated DNA Sequences
Check it out, guys~
精华主题学分
在线时间 小时
LZ真业界良心!!!!!!大赞一个!!!
精华主题学分
在线时间 小时
你,太,好,了
精华主题学分
在线时间 小时
楼主好棒!
精华主题学分
在线时间 小时
业界良心!LZ好人一生平安!
精华主题学分
在线时间 小时
谢谢,看看lz思路
<form method="post" autocomplete="off" id="fastpostform" action="forum.php?mod=post&action=reply&fid=84&tid=115677&extra=&replysubmit=yes&infloat=yes&handlekey=fastpost"
onSubmit="
// TODO Howard 11/3/2015
var sbtn = $('fastpostsubmit');
sbtn.disabled =
sbtn.innerHTML = ' 回复发表中... ';
sbtn.setAttribute('background', sbtn.style.background);
sbtn.setAttribute('bordercolor', sbtn.style.borderColor);
sbtn.style.background = '#C7C7C7';
sbtn.style.borderColor = '#8B8B8B';
var form =
// --product--
var isValid = fastpostvalidate(form, null, 0);
if(!isValid) reoverBtn();
return isV
// --product--
// --testing--
//setTimeout(function() {
// var isValid = fastpostvalidate(form, null, 0);
// if(!isValid) reoverBtn();
//}, 2000);
// --testing--
您需要登录后才可以回帖
回帖并转播
回帖后跳转到最后一页
一亩三分地推荐 /5
地主Warald亲手做你的申请,针对你的背景和目标,考虑申请、学习、就业、移民等系列问题,制定申请策略。
“offer”指全额奖学金,免学费全免+每月工资,Berkeley, CMU, JHU, UIUC, Gatech, UMich, UCLA, Columbia,欢迎观赏。
电子工程、计算机、统计、金数金工、化工等, Stanford, Berkeley, CMU, Cornell, Yale, Columbia, Chicago, Duke, UPenn, UIUC, Brown, UMich, JHU等
有留学、申请、找工、职业规划上的难题?先上论坛提问!
论坛考古也帮不上忙,发帖得到的回答仍然不够?电话找Warald来解答!
WARALD新书上市啦:《你不知道的美国留学》清华大学出版社,各大电商发售
Powered by一键安装桌面版,查词翻译快三倍
选择要添加的生词本
词霸Android版
牛津词典免费使用! 立刻扫码下载
牛津词典免费使用! 立刻扫码下载
创建新的生词本
i该生词本已经创建啦!
i不可以出现中文,英文,数字之外的符号哒!
i生词本名称长度不能大于24字符!
i请填写生词本名称!2011年10月 其他开发语言大版内专家分月排行榜第三2010年8月 其他开发语言大版内专家分月排行榜第三2007年5月 其他开发语言大版内专家分月排行榜第三
本帖子已过去太久远了,不再提供回复功能。

我要回帖

更多关于 红米微信聊天记录恢复 的文章

 

随机推荐