浅析python继承与多重继承


Posted in Python onSeptember 13, 2018

记住以下几点:

直接子类化内置类型(如dict,list或str)容易出错,因为内置类型的方法通常会忽略用户覆盖的方法,不要子类化内置类型,用户自定义的类应该继承collections模块。

def __setitem__(self, key, value):
    super().__setitem__(key, [value] * 2) # 错误案例
class AnswerDict(dict):
  def __getitem__(self, item): # 错误案例
    return 42
import collections
class DoppelDict2(collections.UserDict): # 正确案例
  def __setitem__(self, key, value):
    super().__setitem__(key, [value] * 2)
class AnswerDict2(collections.UserDict): # 正确案例
  def __getitem__(self, item):
    return 42

多重继承有关的另一个问题就是:如果同级别的超类定义了同名属性.Python如何确定使用哪个?

class DoppelDict(dict):
  def __setitem__(self, key, value):
    super().__setitem__(key, [value] * 2)
class AnswerDict(dict):
  def __getitem__(self, item):
    return 42
import collections
class DoppelDict2(collections.UserDict):
  def __setitem__(self, key, value):
    super().__setitem__(key, [value] * 2)
class AnswerDict2(collections.UserDict):
  def __getitem__(self, item):
    return 42
class A:
  def ping(self):
    print('Ping:', self)
class B(A):
  def pong(self):
    print('pong:', self)
class C(A):
  def pong(self):
    print('PONG:', self)
class D(B, C):
  def ping(self):
    super().ping()
    print('post-ping:', self)
  def pingpong(self):
    self.ping()
    super().ping()
    self.pong()
    super().pong()
    C.pong(self)
if __name__ == '__main__':
  d = D()
  print(d.pong()) # 输出来源于B
  print(C.pong(d)) #输出来源于C 超类的方法都可以直接调用,此时要把实例作为显示参数传入.

python能区别调用的是哪个方法,通过方法解析顺序

>>> D.mro()

[<class '__main__.D'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.A'>, <class 'object'>]

若想把方法调用委托给超类,推荐的方式是使用内置的super()函数.

以下是对于d.pingpong()方法的解读

>>> self.ping()

Ping: <__main__.D object at 0x000002213877F2B0> post-ping: <__main__.D object at 0x000002213877F2B0> 第一个调用的是self.ping(),运行的是是D类的ping,方法.

第二个调用的的是super().ping(),跳过D类的ping方法,找到A类的ping方法.Ping: <__main__.D object at 0x000002213877F2B0>

第三个调用的是self.pong()方法,根据__mro__,找到B类实现的pong方法. pong: <__main__.D object at 0x000002213877F2B0>

第四个调用时super().pong(),也是根据__mro__,找到B类实现的pong方法. pong: <__main__.D object at 0x000002213877F2B0>

第五个调用的是C.pong(self),忽略了__mro__,找到的是C类实现的pong方法. PONG: <__main__.D object at 0x000002213877F2B0>

Python 相关文章推荐
python使用Queue在多个子进程间交换数据的方法
Apr 18 Python
在IIS服务器上以CGI方式运行Python脚本的教程
Apr 25 Python
python执行子进程实现进程间通信的方法
Jun 02 Python
python 接口测试response返回数据对比的方法
Feb 11 Python
python学习笔记--将python源文件打包成exe文件(pyinstaller)
May 26 Python
python实现网站微信登录的示例代码
Sep 18 Python
使用pyqt5 tablewidget 单元格设置正则表达式
Dec 13 Python
Python定义函数时参数有默认值问题解决
Dec 19 Python
使用 Python ssh 远程登陆服务器的最佳方案
Mar 06 Python
python代码如何注释
Jun 01 Python
python实现杨辉三角的几种方法代码实例
Mar 02 Python
python tkinter Entry控件的焦点移动操作
May 22 Python
Python中分支语句与循环语句实例详解
Sep 13 #Python
Python爬虫小技巧之伪造随机的User-Agent
Sep 13 #Python
Python爬虫基础之XPath语法与lxml库的用法详解
Sep 13 #Python
Python爬虫常用小技巧之设置代理IP
Sep 13 #Python
python集合比较(交集,并集,差集)方法详解
Sep 13 #Python
python中dict字典的查询键值对 遍历 排序 创建 访问 更新 删除基础操作方法
Sep 13 #Python
Python字典创建 遍历 添加等实用基础操作技巧
Sep 13 #Python
You might like
PHP setTime 设置当前时间的代码
2012/08/27 PHP
简单的php新闻发布系统教程
2014/05/09 PHP
在laravel中使用Symfony的Crawler组件分析HTML
2017/06/19 PHP
js格式化金额可选是否带千分位以及保留精度
2014/01/28 Javascript
js中匿名函数的创建与调用方法分析
2014/12/19 Javascript
jQuery中大家不太了解的几个方法
2015/03/04 Javascript
使用纯javascript实现放大镜效果
2015/03/18 Javascript
在Ubuntu系统上安装Ghost博客平台的教程
2015/06/17 Javascript
bootstrapfileinput实现文件自动上传
2016/11/08 Javascript
Bootstrap整体框架之JavaScript插件架构
2016/12/15 Javascript
详解Angular 4.x 动态创建组件
2017/04/25 Javascript
webpack搭建vue 项目的步骤
2017/12/27 Javascript
pageGroup.js实现分页功能
2019/07/27 Javascript
JS中FileReader类实现文件上传及时预览功能
2020/03/27 Javascript
基于jQuery拖拽事件的封装
2020/11/29 jQuery
[01:53]DOTA2超级联赛专访Zhou 五年职业青春成长
2013/05/29 DOTA
[52:15]2014 DOTA2国际邀请赛中国区预选赛5.21 HGT VS LGD-GAMING
2014/05/23 DOTA
[02:43]2014DOTA2国际邀请赛 官方Alliance战队纪录片
2014/07/14 DOTA
[03:58]兄弟们,回来开黑了!DOTA2昔日战友招募宣传视频
2016/07/17 DOTA
Python实现的数据结构与算法之链表详解
2015/04/22 Python
Python实现将doc转化pdf格式文档的方法
2018/01/19 Python
对Python中list的倒序索引和切片实例讲解
2018/11/15 Python
python得到一个excel的全部sheet标签值方法
2018/12/10 Python
python中的协程深入理解
2019/06/10 Python
python从list列表中选出一个数和其对应的坐标方法
2019/07/20 Python
手机使用python操作图片文件(pydroid3)过程详解
2019/09/25 Python
TensorFlow实现保存训练模型为pd文件并恢复
2020/02/06 Python
全球知名旅游社区巴西站点:TripAdvisor巴西
2016/07/21 全球购物
《小石潭记》教学反思
2014/02/13 职场文书
联谊会主持词
2014/03/26 职场文书
土地转让协议书范本
2014/04/15 职场文书
关于青春的演讲稿三分钟
2014/08/22 职场文书
家装业务员岗位职责
2015/04/03 职场文书
资金申请报告范文
2015/05/14 职场文书
大学生党员暑假实践(活动总结)
2019/08/21 职场文书
PyTorch device与cuda.device用法
2022/04/03 Python