浅析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的@property装饰器的用法
Apr 28 Python
Python读写文件方法总结
Jun 09 Python
简单谈谈python中的多进程
Nov 06 Python
Python中模块string.py详解
Mar 12 Python
python使用fcntl模块实现程序加锁功能示例
Jun 23 Python
使用python编写监听端
Apr 12 Python
python将一组数分成每3个一组的实例
Nov 14 Python
10行Python代码计算汽车数量的实现方法
Oct 23 Python
Python hmac模块使用实例解析
Dec 24 Python
Pytorch 使用 nii数据做输入数据的操作
May 26 Python
python中有函数重载吗
May 28 Python
Python + opencv对拍照得到的图片进行背景去除的实现方法
Nov 18 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数据类型之布尔型的介绍
2013/04/28 PHP
PHP使用GIFEncoder类生成gif动态滚动字幕
2014/07/01 PHP
ThinkPHP的SAE开发相关注意事项详解
2016/10/09 PHP
php上传excel表格并获取数据
2017/04/27 PHP
Yii2语言国际化的配置教程
2018/08/19 PHP
PHP实现简单的协程任务调度demo示例
2020/02/01 PHP
Javascript 表单之间的数据传递代码
2008/12/04 Javascript
浅析onsubmit校验表单时利用ajax的return false无效问题
2013/07/10 Javascript
判断客户浏览器是否支持cookie的示例代码
2013/12/23 Javascript
JS获取各种宽度、高度的简单介绍
2014/12/19 Javascript
JS简单实现数组去重的方法示例
2017/03/27 Javascript
如何使用Bootstrap创建表单
2017/03/29 Javascript
js禁止浏览器的回退事件
2017/04/20 Javascript
vue中将网页打印成pdf实例代码
2017/06/15 Javascript
详解webpack异步加载业务模块
2017/06/23 Javascript
js页面加载后执行的几种方式小结
2020/01/30 Javascript
微信小程序 flexbox layout快速实现基本布局的解决方案
2020/03/24 Javascript
Vue关于组件化开发知识点详解
2020/05/13 Javascript
python获取元素在数组中索引号的方法
2015/07/15 Python
Python简单定义与使用字典dict的方法示例
2017/07/25 Python
Python基于多线程实现ping扫描功能示例
2018/07/23 Python
Python3爬虫学习之应对网站反爬虫机制的方法分析
2018/12/12 Python
Pyqt QImage 与 np array 转换方法
2019/06/27 Python
python如何将多个PDF进行合并
2019/08/13 Python
安装多个版本的TensorFlow的方法步骤
2020/04/21 Python
为什么说python更适合树莓派编程
2020/07/20 Python
pytorch加载语音类自定义数据集的方法教程
2020/11/10 Python
pymongo insert_many 批量插入的实例
2020/12/05 Python
使用Python获取爱奇艺电视剧弹幕数据的示例代码
2021/01/12 Python
美国背景检查、公共记录和人物搜索网站:BeenVerified
2018/02/25 全球购物
四议两公开实施方案
2014/03/28 职场文书
关于感谢信的范文
2015/01/23 职场文书
小学六一主持词开场白
2015/05/28 职场文书
有关水浒传的读书笔记
2015/06/25 职场文书
2015年高三教学工作总结
2015/07/21 职场文书
python spilt()分隔字符串的实现示例
2021/05/21 Python