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继承方式相关推荐

  1. python继承方式是基于原型吗_[译] 为什么原型继承很重要

    五天之前我写了一个关于ES6标准中Class的文章.在里面我介绍了如何用现有的Javascript来模拟类并且介绍了ES6中类的用法,其实它只是一个语法糖.感谢Om Shakar以及Javascrip ...

  2. python继承方式是基于原型吗_基于原型与基于类的继承

    小编典典 这里大约有一百个术语问题,大多数是围绕某人(不是您)试图使他们的想法听起来像是"最好的". 所有面向对象的语言都必​​须能够处理以下几个概念: 数据封装以及对数据的关联操 ...

  3. Python深度学习:基于PyTorch [Deep Learning with Python and PyTorch]

    作者:吴茂贵,郁明敏,杨本法,李涛,张粤磊 著 出版社:机械工业出版社 品牌:机工出版 出版时间:2019-11-01 Python深度学习:基于PyTorch [Deep Learning with ...

  4. 运行python程序的两种方式交互式和文件式_执行Python程序的两种方式

    交互式(了解) 交互式环境下,敲完一条命令按下enter键马上能看到结果,调试程序方便.程序无法永久保存,关掉cmd窗口数据就消失了. 命令行式(了解) 打开文本编辑器,在文本编辑器中写入一串字符. ...

  5. python携程怎么做数据同步_利用python yielding创建协程将异步编程同步化

    转自:http://www.jackyshen.com/2015/05/21/async-operations-in-form-of-sync-programming-with-python-yiel ...

  6. python程序设计案例教程 张思民_《Python程序设计案例教程——从入门到机器学习(微课版)》.doc...

    1 - 1 - 作者:张思民 定价:49元 ISBN:9787302510147 <Python应用程序设计>课程教学大纲 一.课程基本信息 中文名称:Python应用程序设计 英文名称: ...

  7. python查询和替换一个文本字符串_【Python】python面试题

    一些Python面试题 1. (1)python下多线程的限制以及多进程中传递参数的方式 python多线程有个全局解释器锁(global interpreter lock),这个锁的意思是任一时间只 ...

  8. 在python中print表示的数据类型是_【Python连载】那些必须掌握的Python数据类型

    原标题:[Python连载]那些必须掌握的Python数据类型 经过近几年的发展,Python已成为了数据科学和机器学习的首选语言,许多人也因此开始走上自学python之路.从今天开始,本公众号将陆续 ...

  9. python七段数码管绘制单个数字_使用Python的turtle库实现七段数码管绘制

    七段数码管绘制: 七段数码管是由7段数码管拼接而成,每段有亮或不亮两种情况,改进的七段数码管还包括一个小数点位置. 七段数码管能形成2^7=128种状态,其中部分状态能够显示易于人们理解的数字或字母含 ...

  10. python开发环境有中文的吗_中文 python

    Python sublime 中文的问题汇总[收藏] Python sublime 中文编译和中文路径问题 转载请标明出处: https://blog.csdn.net/DJY1992/article ...

最新文章

  1. 为什么要用promise处理ajax,用promise.all解决ajax异步循环请求问题
  2. 外贸网络推广浅谈蜘蛛抓取频次的原则跟哪些有关?
  3. JS中给一个对象动态追加key
  4. LSMW批处理使用方法(08)_步骤8、9
  5. 未曾秋高气爽,亦然爬山去也
  6. Qt简介以及如何配置Qt使用VS2010进行开发
  7. About Undefined Behavior[译文]
  8. javascript 使用canvas绘画
  9. python tqdm模块的简单使用
  10. adb 重启应用程序
  11. 一篇文章搞懂BIM技术的要点和前景
  12. adadelta算法_机器学习中的优化算法(3)-AdaGrad, Adadelta(附Python示例)
  13. 【整理】详解Python中re.sub
  14. 2207.16吃货联盟设计大纲和全部代码
  15. VMware虚拟机无法识别U盘
  16. Word秘籍:如何30秒做出精美的Word排版
  17. 第 05 篇 如何使用 SQL 语句进行模糊查找?
  18. ChatGPT通过中国数据库系统工程师(DBA)认证?
  19. 阿里云服务器优惠活动中的突发性/共享型/计算型/通用型实例怎么选
  20. 手把手教你写一个基于python+pyqt5的股票盯盘软件

热门文章

  1. openwrt信号弱掉线_QCA9880 openwrt 信号非常差
  2. ppt设置外观样式_PPT中设置视频外观样式的方法
  3. ADMM算法在神经网络模型剪枝方面的应用
  4. 国图软件无法生成地籍调查表
  5. 戴尔T630安装Ubuntu操作系统及Gaussian 09
  6. Gaussian 安装
  7. Visual Studio 2019 C++实现socket通信,添加ws2_32.lib库,新手代码
  8. chrome谷歌插件
  9. ue编辑器绿色免安装版
  10. 新能源充电桩后台管理系统平台