python继承方式是基于原型吗_【Python】python 普通继承方式和super继承方式
Python中对象方法的定义很怪异,第一个参数一般都命名为self(相当于其它语言的this),用于传递对象本身,而在调用的时候则不必显式传递,系统会自动传递。
举一个很常见的例子:
>>> class Foo:
def bar(self, message):
print(message)
>>> Foo().bar("Hello, World.")
Hello, World.
当存在继承关系的时候,有时候需要在子类中调用父类的方法,此时最简单的方法是把对象调用转换成类调用,需要注意的是这时self参数需要显式传递,例如:
>>> class FooParent:
def bar(self, message):
print(message)
>>> class FooChild(FooParent):
def bar(self, message):
FooParent.bar(self, message)
>>> FooChild().bar("Hello, World.")
Hello, World.
这样做有一些缺点,比如说如果修改了父类名称,那么在子类中会涉及多处修改,另外,Python是允许多继承的语言,如上所示的方法在多继承时就需要重复写多次,显得累赘。为了解决这些问题,Python引入了super()机制,例子代码如下:
>>> class FooParent:
def bar(self, message):
print(message)
>>> class FooChild(FooParent):
def bar(self, message):
super(FooChild, self).bar(message)
>>> FooChild().bar("Hello, World.")
Hello, World.
表面上看 super(FooChild, self).bar(message)方法和FooParent.bar(self, message)方法的结果是一致的,实际上这两种方法的内部处理机制大大不同,当涉及多继承情况时,就会表现出明显的差异来,直接给例子:
代码一:
class A:
def __init__(self):
print("Enter A")
print("Leave A")
class B(A):
def __init__(self):
print("Enter B")
A.__init__(self)
print("Leave B")
class C(A):
def __init__(self):
print("Enter C")
A.__init__(self)
print("Leave C")
class D(A):
def __init__(self):
print("Enter D")
A.__init__(self)
print("Leave D")
class E(B, C, D):
def __init__(self):
print("Enter E")
B.__init__(self)
C.__init__(self)
D.__init__(self)
print("Leave E")
E()
结果:
Enter E
Enter B
Enter A
Leave A
Leave B
Enter C
Enter A
Leave A
Leave C
Enter D
Enter A
Leave A
Leave D
Leave E
执行顺序很好理解,唯一需要注意的是公共父类A被执行了多次。
代码二:
class A:
def __init__(self):
print("Enter A")
print("Leave A")
class B(A):
def __init__(self):
print("Enter B")
super(B, self).__init__()
print("Leave B")
class C(A):
def __init__(self):
print("Enter C")
super(C, self).__init__()
print("Leave C")
class D(A):
def __init__(self):
print("Enter D")
super(D, self).__init__()
print("Leave D")
class E(B, C, D):
def __init__(self):
print("Enter E")
super(E, self).__init__()
print("Leave E")
E()
结果:
Enter E
Enter B
Enter C
Enter D
Enter A
Leave A
Leave D
Leave C
Leave B
Leave E
在super机制里可以保证公共父类仅被执行一次,至于执行的顺序,是按照mro进行的(E.__mro__)。
参考资料:
http://blog.csdn.net/u010069176/article/details/51734338
http://www.cnblogs.com/dkblog/archive/2011/02/24/1980654.html
自定义异常:http://blog.sina.com.cn/s/blog_151a5b5330102wqsg.html
python继承方式是基于原型吗_【Python】python 普通继承方式和super继承方式相关推荐
- python继承方式是基于原型吗_[译] 为什么原型继承很重要
五天之前我写了一个关于ES6标准中Class的文章.在里面我介绍了如何用现有的Javascript来模拟类并且介绍了ES6中类的用法,其实它只是一个语法糖.感谢Om Shakar以及Javascrip ...
- python继承方式是基于原型吗_基于原型与基于类的继承
小编典典 这里大约有一百个术语问题,大多数是围绕某人(不是您)试图使他们的想法听起来像是"最好的". 所有面向对象的语言都必须能够处理以下几个概念: 数据封装以及对数据的关联操 ...
- Python深度学习:基于PyTorch [Deep Learning with Python and PyTorch]
作者:吴茂贵,郁明敏,杨本法,李涛,张粤磊 著 出版社:机械工业出版社 品牌:机工出版 出版时间:2019-11-01 Python深度学习:基于PyTorch [Deep Learning with ...
- 运行python程序的两种方式交互式和文件式_执行Python程序的两种方式
交互式(了解) 交互式环境下,敲完一条命令按下enter键马上能看到结果,调试程序方便.程序无法永久保存,关掉cmd窗口数据就消失了. 命令行式(了解) 打开文本编辑器,在文本编辑器中写入一串字符. ...
- python携程怎么做数据同步_利用python yielding创建协程将异步编程同步化
转自:http://www.jackyshen.com/2015/05/21/async-operations-in-form-of-sync-programming-with-python-yiel ...
- python程序设计案例教程 张思民_《Python程序设计案例教程——从入门到机器学习(微课版)》.doc...
1 - 1 - 作者:张思民 定价:49元 ISBN:9787302510147 <Python应用程序设计>课程教学大纲 一.课程基本信息 中文名称:Python应用程序设计 英文名称: ...
- python查询和替换一个文本字符串_【Python】python面试题
一些Python面试题 1. (1)python下多线程的限制以及多进程中传递参数的方式 python多线程有个全局解释器锁(global interpreter lock),这个锁的意思是任一时间只 ...
- 在python中print表示的数据类型是_【Python连载】那些必须掌握的Python数据类型
原标题:[Python连载]那些必须掌握的Python数据类型 经过近几年的发展,Python已成为了数据科学和机器学习的首选语言,许多人也因此开始走上自学python之路.从今天开始,本公众号将陆续 ...
- python七段数码管绘制单个数字_使用Python的turtle库实现七段数码管绘制
七段数码管绘制: 七段数码管是由7段数码管拼接而成,每段有亮或不亮两种情况,改进的七段数码管还包括一个小数点位置. 七段数码管能形成2^7=128种状态,其中部分状态能够显示易于人们理解的数字或字母含 ...
- python开发环境有中文的吗_中文 python
Python sublime 中文的问题汇总[收藏] Python sublime 中文编译和中文路径问题 转载请标明出处: https://blog.csdn.net/DJY1992/article ...
最新文章
- 为什么要用promise处理ajax,用promise.all解决ajax异步循环请求问题
- 外贸网络推广浅谈蜘蛛抓取频次的原则跟哪些有关?
- JS中给一个对象动态追加key
- LSMW批处理使用方法(08)_步骤8、9
- 未曾秋高气爽,亦然爬山去也
- Qt简介以及如何配置Qt使用VS2010进行开发
- About Undefined Behavior[译文]
- javascript 使用canvas绘画
- python tqdm模块的简单使用
- adb 重启应用程序
- 一篇文章搞懂BIM技术的要点和前景
- adadelta算法_机器学习中的优化算法(3)-AdaGrad, Adadelta(附Python示例)
- 【整理】详解Python中re.sub
- 2207.16吃货联盟设计大纲和全部代码
- VMware虚拟机无法识别U盘
- Word秘籍:如何30秒做出精美的Word排版
- 第 05 篇 如何使用 SQL 语句进行模糊查找?
- ChatGPT通过中国数据库系统工程师(DBA)认证?
- 阿里云服务器优惠活动中的突发性/共享型/计算型/通用型实例怎么选
- 手把手教你写一个基于python+pyqt5的股票盯盘软件