浅析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装饰器入门学习教程(九步学习)
Jan 28 Python
Python三级目录展示的实现方法
Sep 28 Python
python实现微信小程序自动回复
Sep 10 Python
PySide和PyQt加载ui文件的两种方法
Feb 27 Python
使用Python做垃圾分类的原理及实例代码附源码
Jul 02 Python
python采集百度搜索结果带有特定URL的链接代码实例
Aug 30 Python
浅析Python+OpenCV使用摄像头追踪人脸面部血液变化实现脉搏评估
Oct 17 Python
python opencv如何实现图片绘制
Jan 19 Python
Python实现对adb命令封装
Mar 06 Python
Pycharm操作Git及GitHub的步骤详解
Oct 27 Python
让你相见恨晚的十个Python骚操作
Nov 18 Python
解决Jupyter-notebook不弹出默认浏览器的问题
Mar 30 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
PHP4实际应用经验篇(7)
2006/10/09 PHP
PHP新手上路(七)
2006/10/09 PHP
ThinkPHP中ajax使用实例教程
2014/08/22 PHP
PHP中执行cmd命令的方法
2014/10/11 PHP
php+mysql实现无限级分类
2015/11/11 PHP
JScript内置对象Array中元素的删除方法
2007/03/08 Javascript
只需一行代码,轻松实现一个在线编辑器
2013/11/12 Javascript
js用正则表达式来验证表单(比较齐全的资源)
2013/11/17 Javascript
javascript实现节点(div)名称编辑
2014/12/17 Javascript
基于jquery实现人物头像跟随鼠标转动
2015/08/23 Javascript
jQuery实现表格隔行及滑动,点击时变色的方法【测试可用】
2016/08/20 Javascript
微信小程序 简单DEMO布局,逻辑,样式的练习
2016/11/30 Javascript
livereload工具实现前端可视化开发【推荐】
2016/12/23 Javascript
微信小程序 支付功能(前端)的实现
2017/05/24 Javascript
vue 插值 v-once,v-text, v-html详解
2018/01/19 Javascript
vue输入框使用模糊搜索功能的实现代码
2020/05/26 Javascript
[03:51]吞吞映像 每周精彩击杀top10第二弹
2014/06/25 DOTA
[56:18]VGJ.S vs Secret 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
python自动翻译实现方法
2016/05/28 Python
Python中xml和dict格式转换的示例代码
2019/11/07 Python
django xadmin action兼容自定义model权限教程
2020/03/30 Python
Python判断三段线能否构成三角形的代码
2020/04/12 Python
Python unittest如何生成HTMLTestRunner模块
2020/09/08 Python
详解java调用python的几种用法(看这篇就够了)
2020/12/10 Python
CSS3 选择器 属性选择器介绍
2012/01/21 HTML / CSS
打造经典复古风格的品牌:Alice + Olivia(爱丽丝+奥利维亚)
2016/09/07 全球购物
英国No.1文具和办公用品在线:Euroffice
2016/09/21 全球购物
学期研究性学习个人的自我评价
2014/01/09 职场文书
《庐山的云雾》教学反思
2014/04/22 职场文书
啤酒节策划方案
2014/05/28 职场文书
初中团支书竞选稿
2015/11/21 职场文书
找规律教学反思
2016/02/23 职场文书
vue中data改变后让视图同步更新的方法
2021/03/29 Vue.js
python基础详解之if循环语句
2021/04/24 Python
MySQL REVOKE实现删除用户权限
2021/06/18 MySQL
Win10加载疑难解答时出错发生意外错误的解决方法
2022/07/07 数码科技