浅析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 相关文章推荐
rhythmbox中文名乱码问题解决方法
Sep 06 Python
python抓取京东商城手机列表url实例代码
Dec 18 Python
将Python代码嵌入C++程序进行编写的实例
Jul 31 Python
Python中字典的基础知识归纳小结
Aug 19 Python
Python实现带百分比的进度条
Jun 28 Python
python学习之面向对象【入门初级篇】
Jan 21 Python
查找python项目依赖并生成requirements.txt的方法
Jul 10 Python
基于pytorch的保存和加载模型参数的方法
Aug 17 Python
Django之使用内置函数和celery发邮件的方法示例
Sep 16 Python
django rest framework serializers序列化实例
May 13 Python
解决python存数据库速度太慢的问题
Apr 23 Python
python opencv旋转图片的使用方法
Jun 04 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 缓冲的免费实现方法
2006/10/09 PHP
PHP 根据IP地址控制访问的代码
2010/04/22 PHP
Codeigniter注册登录代码示例
2014/06/12 PHP
php使用explode()函数将字符串拆分成数组的方法
2015/02/17 PHP
php计算整个mysql数据库大小的方法
2015/06/19 PHP
php基于curl重写file_get_contents函数实例
2016/11/08 PHP
Yii 框架使用数据库(databases)的方法示例
2020/05/19 PHP
仿163填写邮件地址自动显示下拉(无优化)
2008/11/05 Javascript
JavaScript 浏览器验证代码(来自discuz)
2010/07/17 Javascript
javascript实现点击后变换按钮显示文字的方法
2015/05/13 Javascript
js计算系统当前日期是星期几的方法
2016/07/14 Javascript
js canvas实现擦除动画
2016/07/16 Javascript
详解原生js实现offset方法
2017/06/15 Javascript
详解Vue webapp项目通过HBulider打包原生APP(vue+webpack+HBulider)
2019/02/02 Javascript
Vue中实现权限控制的方法示例
2019/06/07 Javascript
bootstrap Table实现合并相同行
2019/07/19 Javascript
原生js实现轮播图特效
2020/05/04 Javascript
[40:16]TFT vs Mski Supermajor小组赛C组 BO3 第二场 6.3
2018/06/04 DOTA
[01:21]DOTA2 新英雄 森海飞霞
2020/12/18 DOTA
利用Python获取操作系统信息实例
2016/09/02 Python
python操作oracle的完整教程分享
2018/01/30 Python
python矩阵转换为一维数组的实例
2018/06/05 Python
Python numpy.array()生成相同元素数组的示例
2018/11/12 Python
远程部署工具Fabric详解(支持Python3)
2019/07/04 Python
python模拟键盘输入 切换键盘布局过程解析
2019/08/15 Python
纯CSS3实现自定义Tooltip边框涂鸦风格的教程
2014/11/05 HTML / CSS
KEETSA环保床垫:更好的睡眠,更好的生活!
2016/11/24 全球购物
小学科学教学反思
2014/01/26 职场文书
学习十八大报告感言
2014/02/04 职场文书
总裁助理岗位职责
2014/02/17 职场文书
学校后勤岗位职责
2014/02/19 职场文书
司机职责范本
2014/03/08 职场文书
户外活动策划方案
2014/03/12 职场文书
个人师德师风自我剖析材料
2014/09/29 职场文书
校运会班级霸气口号
2015/12/24 职场文书
2016年小学端午节活动总结
2016/04/01 职场文书