Python super() 函数 - 菜鸟教程

文章推薦指數: 80 %
投票人數:10人

#!/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顺序:(,,,,)super的本质如下:defsuper(cls,inst):mro=inst.__class__.mro()returnmro[mro.index(cls)+1]没有昵称   没有昵称  noe***[email protected]  参考地址2年前(2020-04-18) #0   WillYW  187***[email protected]中继承遵循广度优先原则: classA: def__init__(self): print("EnterA") print(self) print("LeaveA") classB(A): def__init__(self): print("EnterB") print(self) super(B,self).__init__() print("LeaveB") classC(A): def__init__(self): print("EnterC") print(self) super(C,self).__init__() print("LeaveC") classD(B,C): def__init__(self): print("EnterD") print(self) super(D,self).__init__() print("LeaveD") d=D() 运行结果: EnterD <__main__.dobjectat0x7fdb02618490> EnterB <__main__.dobjectat0x7fdb02618490> EnterC <__main__.dobjectat0x7fdb02618490> EnterA <__main__.dobjectat0x7fdb02618490> LeaveA LeaveC LeaveB LeaveD 1.创建D类的对象d时,自动调用D类的初始化方法__init()__,此时的self指向D类创建的实例对象d; 2.调用原则:D->B->C->A 3.在调用到B时,首先输出“EnterB”,但是运行到父类A的初始化方法时不立即调用,反而时转向广度优先级高的C类,因为A类对于B类来说是深度遍历。

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 微信关注



請為這篇文章評分?