浅析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 私有函数的实例详解
Sep 11 Python
Python tkinter实现的图片移动碰撞动画效果【附源码下载】
Jan 04 Python
Python线性回归实战分析
Feb 01 Python
python解析含有重复key的json方法
Jan 22 Python
在python 中split()使用多符号分割的例子
Jul 15 Python
python字符串分割及字符串的一些常规方法
Jul 24 Python
Python实现的企业粉丝抽奖功能示例
Jul 26 Python
Python绘制三角函数图(sin\cos\tan)并标注特定范围的例子
Dec 04 Python
python 一维二维插值实例
Apr 22 Python
python 爬取免费简历模板网站的示例
Sep 27 Python
关于Python3的import问题(pycharm可以运行命令行import错误)
Nov 18 Python
Django操作cookie的实现
May 26 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
Apache环境下PHP利用HTTP缓存协议原理解析及应用分析
2010/02/16 PHP
php in_array 函数使用说明与in_array需要注意的地方说明
2010/04/13 PHP
php中实现精确设置session过期时间的方法
2014/07/17 PHP
php获取从百度、谷歌等搜索引擎进入网站关键词的方法
2015/07/08 PHP
2017年最好用的9个php开发工具推荐(超好用)
2017/10/23 PHP
JavaScript 入门基础知识 想学习js的朋友可以参考下
2009/12/26 Javascript
JQury slideToggle闪烁问题及解决办法
2011/07/05 Javascript
IE6背景图片不缓存问题解决方案及图片使用策略多个方法小结
2012/05/14 Javascript
js中eval()函数和trim()去掉字符串左右空格应用
2013/02/02 Javascript
javascript变量作用域使用中常见错误总结
2013/03/26 Javascript
Jquery和JS用外部变量获取Ajax返回的参数值的方法实例(超简单)
2013/06/17 Javascript
JS读取XML文件示例代码
2013/11/15 Javascript
javascript数组操作方法小结和3个属性详细介绍
2014/07/05 Javascript
JS获取客户端IP地址、MAC和主机名的7个方法汇总
2014/07/21 Javascript
AngularJS中$apply方法和$watch方法用法总结
2016/12/13 Javascript
Javascript操作dom对象之select全面解析
2017/04/24 Javascript
JavaScript初学者必看“new”
2017/06/12 Javascript
利用node.js爬取指定排名网站的JS引用库详解
2017/07/25 Javascript
浅谈Vue.js 组件中的v-on绑定自定义事件理解
2017/11/17 Javascript
详解es6超好用的语法糖Decorator
2018/08/01 Javascript
如何实现js拖拽效果及原理解析
2020/05/08 Javascript
简单谈谈python的反射机制
2016/06/28 Python
PyQt5基本控件使用之消息弹出、用户输入、文件对话框的使用方法
2019/08/06 Python
html5的画布canvas——画出弧线、旋转的图形实例代码+效果图
2013/06/09 HTML / CSS
HTML5所有标签汇总及标签意义解释
2015/03/12 HTML / CSS
美国和加拿大房车出售在线分类广告:RVT.com
2018/04/23 全球购物
介绍一下Python下range()函数的用法
2013/11/07 面试题
采购主管工作职责
2013/12/12 职场文书
高中生期末评语
2014/01/28 职场文书
记帐员岗位责任制
2014/02/08 职场文书
装饰活动策划方案
2014/02/11 职场文书
2015年幼儿园中班开学寄语
2015/05/27 职场文书
食品安全主题班会
2015/08/13 职场文书
《用字母表示数》教学反思
2016/02/17 职场文书
诗词赏析-(浣溪沙)
2019/08/13 职场文书
基于PyTorch实现一个简单的CNN图像分类器
2021/05/29 Python