Python super() 函数 - 菜鸟教程
文章推薦指數: 80 %
#!/usr/bin/python # -*- coding: UTF-8 -*- class FooParent(object): def __init__(self): self.parent = 'I\'m the parent.' print ('Parent') def bar(self ...
菜鸟教程--学的不仅是技术,更是梦想!
首页
HTML
CSS
JavaScript
Vue
Bootstrap
NodeJS
Python3
Python2
Java
C
C++
C#
Go
SQL
Linux
jQuery
本地书签
首页
HTML
CSS
JS
本地书签
Search
Python3教程
Python2教程
Vue3教程
vue2教程
Bootstrap3教程
Bootstrap4教程
Bootstrap5教程
Bootstrap2教程
Python基础教程
Python基础教程
Python简介
Python环境搭建
Python中文编码
Python基础语法
Python变量类型
Python运算符
Python条件语句
Python循环语句
PythonWhile循环语句
Pythonfor循环语句
Python循环嵌套
Pythonbreak语句
Pythoncontinue语句
Pythonpass语句
PythonNumber(数字)
Python字符串
Python列表(List)
Python元组
Python字典(Dictionary)
Python日期和时间
Python函数
Python模块
Python文件I/O
PythonFile方法
Python异常处理
PythonOS文件/目录方法
Python内置函数
Python高级教程
Python面向对象
Python正则表达式
PythonCGI编程
PythonMySQL
Python网络编程
PythonSMTP
Python多线程
PythonXML解析
PythonGUI编程(Tkinter)
Python2.x与3.x版本区别
PythonIDE
PythonJSON
Python100例
Python测验
Pythonissubclass()函数
Pythonbin()函数
Pythonsuper()函数
Python内置函数
描述
super()函数是用于调用父类(超类)的一个方法。
super()是用来解决多重继承问题的,直接用类名调用父类方法在使用单继承的时候没问题,但是如果使用多继承,会涉及到查找顺序(MRO)、重复调用(钻石继承)等种种问题。
MRO就是类的方法解析顺序表,其实也就是继承父类方法时的顺序表。
语法
以下是super()方法的语法:
super(type[,object-or-type])
参数
type--类。
object-or-type--类,一般是self
Python3.x和Python2.x的一个区别是:Python3可以使用直接使用super().xxx代替super(Class,self).xxx:
Python3.x实例:classA:
defadd(self,x):
y=x+1
print(y)
classB(A):
defadd(self,x):
super().add(x)
b=B()
b.add(2)#3
Python2.x实例:#!/usr/bin/python
#-*-coding:UTF-8-*-
classA(object):#Python2.x记得继承object
defadd(self,x):
y=x+1
print(y)
classB(A):
defadd(self,x):
super(B,self).add(x)
b=B()
b.add(2)#3
返回值
无。
实例
以下展示了使用super函数的实例:
实例
#!/usr/bin/python
#-*-coding:UTF-8-*-
classFooParent(object):
def__init__(self):
self.parent='I\'mtheparent.'
print('Parent')
defbar(self,message):
print("%sfromParent"%message)
classFooChild(FooParent):
def__init__(self):
#super(FooChild,self)首先找到FooChild的父类(就是类FooParent),然后把类FooChild的对象转换为类FooParent的对象
super(FooChild,self).__init__()
print('Child')
defbar(self,message):
super(FooChild,self).bar(message)
print('Childbarfuction')
print(self.parent)
if__name__=='__main__':
fooChild=FooChild()
fooChild.bar('HelloWorld')
执行结果:
Parent
Child
HelloWorldfromParent
Childbarfuction
I'mtheparent.
Python内置函数
Pythonissubclass()函数
Pythonbin()函数
4篇笔记
写笔记
#0 sme000 523***[email protected] 参考地址314直接用类名调用父类方法在使用单继承的时候没问题,但是如果使用多继承,会涉及到查找顺序(MRO)。
一开始看到这句话,不太理解。
看了这个文章后,明白了。
我们在学习Python类的时候,总会碰见书上的类中有__init__()这样一个函数,很多同学百思不得其解,其实它就是Python的构造方法。
构造方法类似于类似init()这种初始化方法,来初始化新创建对象的状态,在一个对象呗创建以后会立即调用,比如像实例化一个类:
f=FooBar()
f.init()
使用构造方法就能让它简化成如下形式:
f=FooBar()
你可能还没理解到底什么是构造方法,什么是初始化,下面我们再来举个例子:
classFooBar:
def__init__(self):
self.somevar=42
>>>f=FooBar()
>>>f.somevar
我们会发现在初始化FooBar中的somevar的值为42之后,实例化直接就能够调用somevar的值;如果说你没有用构造方法初始化值得话,就不能够调用,明白了吗?
在明白了构造方法之后,我们来点进阶的问题,那就是构造方法中的初始值无法继承的问题。
例子:
classBird:
def__init__(self):
self.hungry=True
defeat(self):
ifself.hungry:
print'Ahahahah'
else:
print'Nothanks!'
classSongBird(Bird):
def__init__(self):
self.sound='Squawk'
defsing(self):
printself.song()
sb=SongBird()
sb.sing()#能正常输出
sb.eat()#报错,因为songgird中没有hungry特性
那解决这个问题的办法有两种:
1、调用未绑定的超类构造方法(多用于旧版python阵营)
classSongBird(Bird):
def__init__(self):
Bird.__init__(self)
self.sound='Squawk'
defsing(self):
printself.song()
原理:在调用了一个实例的方法时,该方法的self参数会自动绑定到实例上(称为绑定方法);如果直接调用类的方法(比如Bird.__init__),那么就没有实例会被绑定,可以自由提供需要的self参数(未绑定方法)。
2、使用super函数(只在新式类中有用)
classSongBird(Bird):
def__init__(self):
super(SongBird,self).__init__()
self.sound='Squawk'
defsing(self):
printself.song()
原理:它会查找所有的超类,以及超类的超类,直到找到所需的特性为止。
sme000 sme000 523***[email protected] 参考地址3年前(2019-04-23)
#0 yyYanis ysh***[email protected]经典的菱形继承案例,BC继承A,然后D继承BC,创造一个D的对象。
--->B---
A--||-->D
--->C---
使用super()可以很好地避免构造函数被调用两次。
#思考题正确答案
classA():
def__init__(self):
print('enterA')
print('leaveA')
classB(A):
def__init__(self):
print('enterB')
super().__init__()
print('leaveB')
classC(A):
def__init__(self):
print('enterC')
super().__init__()
print('leaveC')
classD(B,C):
def__init__(self):
print('enterD')
super().__init__()
print('leaveD')
d=D()
执行结果是:
enterD
enterB
enterC
enterA
leaveA
leaveC
leaveB
leaveDyyYanis yyYanis ysh***[email protected]年前(2019-06-11)
#0 没有昵称 noe***[email protected] 参考地址11建议自己单点调试走一遍就能理解super的本质。
classA(object):
def__init__(self):
print("enterA")
print(self)#thiswillprint<__main__.dobjectat0x...>
print("leaveA")
classB(A):
def__init__(self):
print("enterB")
print(self)#thiswillprint<__main__.dobjectat0x...>
super(B,self).__init__()
print("leaveB")
classC(A):
def__init__(self):
print("enterC")
print(self)#thiswillprint<__main__.dobjectat0x...>
super(C,self).__init__()
print("leaveC")
classD(B,C):
pass
d=D()
print("""这是D的MRO顺序:""",d.__class__.__mro__,"""super的本质如下:defsuper(cls,inst):mro=inst.__class__.mro()returnmro[mro.index(cls)+1]""")
运行结果:
enterB
<__main__.dobjectat0x10a833390>
enterC
<__main__.dobjectat0x10a833390>
enterA
<__main__.dobjectat0x10a833390>
leaveA
leaveC
leaveB
这是D的MRO顺序:(
WillYW WillYW 187***[email protected]年前(2020-07-23)
点我分享笔记
取消
分享笔记
昵称昵称(必填)
邮箱邮箱(必填)
引用地址引用地址
分类导航
HTML/CSSHTML教程HTML5教程CSS教程CSS3教程Bootstrap3教程Bootstrap4教程Bootstrap5教程FontAwesome教程Foundation教程JavaScriptJavaScript教程HTMLDOM教程jQuery教程AngularJS教程AngularJS2教程Vue.js教程Vue3教程React教程TypeScript教程jQueryUI教程jQueryEasyUI教程Node.js教程AJAX教程JSON教程Echarts教程Highcharts教程Google地图教程服务端Python教程Python2.x教程Linux教程Docker教程Ruby教程Java教程C教程C++教程Perl教程Servlet教程JSP教程Lua教程Rust教程Scala教程Go教程PHP教程数据结构与算法Django教程Zookeeper教程设计模式正则表达式Maven教程Verilog教程ASP教程AppML教程VBScript教程数据库SQL教程MySQL教程PostgreSQL教程SQLite教程MongoDB教程Redis教程Memcached教程数据分析Python教程NumPy教程Pandas教程Matplotlib教程Scipy教程R教程Julia教程移动端Android教程Swift教程jQueryMobile教程ionic教程Kotlin教程XML教程XML教程DTD教程XMLDOM教程XSLT教程XPath教程XQuery教程XLink教程XPointer教程XMLSchema教程XSL-FO教程SVG教程ASP.NETASP.NET教程C#教程WebPages教程Razor教程MVC教程WebForms教程WebServiceWebService教程WSDL教程SOAP教程RSS教程RDF教程开发工具Eclipse教程Git教程Svn教程Markdown教程网站建设HTTP教程网站建设指南浏览器信息网站主机教程TCP/IP教程W3C教程网站品质
Advertisement
反馈/建议
在线实例
·HTML实例
·CSS实例
·JavaScript实例
·Ajax实例
·jQuery实例
·XML实例
·Java实例
字符集&工具
·HTML字符集设置
·HTMLASCII字符集
·JS混淆/加密
·PNG/JPEG图片压缩
·HTML拾色器
·JSON格式化工具
·随机数生成器
最新更新
·
JavaScript获取...
·
JavaScript实现...
·
HTMLDOMstyle...
·
HTMLDOMscroll...
·
HTMLDOMscroll...
·
HTMLDOMscroll...
·
Dockerstats命令
站点信息
·
意见反馈
·
免责声明
·
关于我们
·
文章归档
关注微信
Copyright©2013-2022菜鸟教程
runoob.comAllRightsReserved.备案号:闽ICP备15012807号-1
微信关注
延伸文章資訊
- 1Python 繼承543 - Dboy Liao
相信寫OOP 的人對於繼承這個概念應該不陌生,Python 身為一個支援OOP 的語言,自然 ... class MiniHorse(Horse): def __init__(self, is_...
- 2Supercharge Your Classes With Python super()
__init__() of the superclass ( Square ) will be called automatically. super() returns a delegate ...
- 3多重繼承 - iT 邦幫忙::一起幫忙解決難題,拯救IT 人的一天
從寫程式到脫離菜雞的歷練(以python為主的資處與檔案權限) 系列第18 篇 ... __init__() #super調用每個class內指定__init__ d = D() d.fc_a(...
- 4Understanding Python super() with __init__() methods
super() lets you avoid referring to the base class explicitly, which can be nice. But the main ad...
- 5super() in Python: What Does It Do? [A Complete Guide]
When you initialize a child class in Python, you can call the super().__init__() method. This ini...