浅析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的shutil模块中文件的复制操作函数详解
Jul 05 Python
Django Highcharts制作图表
Aug 27 Python
详解python中字典的循环遍历的两种方式
Feb 07 Python
Python实现Kmeans聚类算法
Jun 10 Python
Python cookbook(数据结构与算法)让字典保持有序的方法
Feb 18 Python
Python 输出时去掉列表元组外面的方括号与圆括号的方法
Dec 24 Python
用pycharm开发django项目示例代码
Jun 13 Python
python实现自动化报表功能(Oracle/plsql/Excel/多线程)
Dec 02 Python
Django添加bootstrap框架时无法加载静态文件的解决方式
Mar 27 Python
解决python执行较大excel文件openpyxl慢问题
May 15 Python
scrapy redis配置文件setting参数详解
Nov 18 Python
教你怎么用PyCharm为同一服务器配置多个python解释器
May 31 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网站开发中常用的8个小技巧
2015/02/13 PHP
合格的PHP程序员必备技能
2015/11/13 PHP
基于PHP后台的Android新闻浏览客户端
2016/05/23 PHP
PHP 7安装调试工具Xdebug扩展的方法教程
2017/06/17 PHP
jQuery模仿单选按钮选中效果
2016/06/24 Javascript
深入分析javascript中console命令
2016/08/14 Javascript
使用BootStrap建立响应式网页——通栏轮播图(carousel)
2016/12/21 Javascript
javascript回调函数的概念理解与用法分析
2017/05/27 Javascript
10个在JavaScript开发中常遇到的BUG
2017/12/18 Javascript
js实现圆形显示鼠标单击位置
2020/02/11 Javascript
原生js实现html手机端城市列表索引选择城市
2020/06/24 Javascript
[42:32]VP vs RNG 2019国际邀请赛淘汰赛 败者组 BO3 第一场 8.21.mp4
2020/07/19 DOTA
python中文乱码不着急,先看懂字节和字符
2017/12/20 Python
Python实现的栈(Stack)
2018/01/26 Python
Python文本处理之按行处理大文件的方法
2018/04/09 Python
TensorFlow实现随机训练和批量训练的方法
2018/04/28 Python
django rest framework vue 实现用户登录详解
2019/07/29 Python
python SVD压缩图像的实现代码
2019/11/05 Python
python图片合成的示例
2020/11/09 Python
CSS3的calc()做响应模式布局的实现方法
2017/09/06 HTML / CSS
html5 datalist 选中option选项后的触发事件
2020/03/05 HTML / CSS
cosme官方海外旗舰店:日本最大化妆品和美容产品的综合口碑网站
2017/01/18 全球购物
Cult Gaia官网:美国生活方式品牌
2019/08/16 全球购物
Java多态性的定义以及类型
2014/09/16 面试题
Internet主要有哪些网络群组成
2015/12/24 面试题
工商管理专业学生的自我评价
2013/10/01 职场文书
计算机专业大学生的自我评价
2013/11/14 职场文书
大三毕业自我鉴定
2014/01/15 职场文书
公司寄语大全
2014/04/10 职场文书
终止劳动合同协议书
2014/04/14 职场文书
教师师德师风自我剖析材料
2014/09/29 职场文书
高中生毕业评语
2014/12/30 职场文书
会计岗位职责
2015/02/03 职场文书
2015年销售员工作总结范文
2015/04/07 职场文书
网吧员工管理制度
2015/08/05 职场文书
行为规范主题班会
2015/08/13 职场文书