浅析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 相关文章推荐
pycharm 使用心得(三)Hello world!
Jun 05 Python
Python自定义scrapy中间模块避免重复采集的方法
Apr 07 Python
Python CSV模块使用实例
Apr 09 Python
Python内置的HTTP协议服务器SimpleHTTPServer使用指南
Mar 30 Python
tensorflow输出权重值和偏差的方法
Feb 10 Python
对python 中class与变量的使用方法详解
Jun 26 Python
tensorflow 利用expand_dims和squeeze扩展和压缩tensor维度方式
Feb 07 Python
通过实例解析python创建进程常用方法
Jun 19 Python
Python爬虫之Selenium库的使用方法
Jan 03 Python
解决pycharm 格式报错tabs和space不一致问题
Feb 26 Python
python文件名批量重命名脚本实例代码
Apr 22 Python
Python数组变形的几种实现方法
May 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
PHP SPL标准库之数据结构栈(SplStack)介绍
2015/05/12 PHP
基于PHP生成简单的验证码
2016/06/01 PHP
php7基于递归实现删除空文件夹的方法示例
2017/06/15 PHP
Nginx+php配置文件及原理解析
2020/12/09 PHP
JS 常用校验函数
2009/03/26 Javascript
js使浏览器窗口最大化实现代码(适用于IE)
2013/08/07 Javascript
Jquery Validate 正则表达式实用验证代码大全
2013/08/23 Javascript
实现动画效果核心方式的js代码
2013/09/27 Javascript
js的[defer]和[async]属性
2014/11/24 Javascript
jquery层级选择器的实现(匹配后代元素div)
2016/09/05 Javascript
Javascript 实现简单计算器实例代码
2016/10/23 Javascript
JS实现iframe自适应高度的方法示例
2017/01/07 Javascript
Vue 2.5 Level E 发布了: 新功能特性一览
2017/10/24 Javascript
详解angular脏检查原理及伪代码实现
2018/06/08 Javascript
css配合JavaScript实现tab标签切换效果
2018/10/11 Javascript
vue中render函数的使用详解
2018/10/12 Javascript
JS 验证码功能的三种实现方式
2018/11/26 Javascript
vue+layui实现select动态加载后台数据的例子
2019/09/20 Javascript
原生JS无缝滑动轮播图
2019/10/22 Javascript
vue-cli3 取消eslint校验代码的解决办法
2020/01/16 Javascript
[02:25]DOTA2英雄基础教程 熊战士
2014/01/03 DOTA
Python基于datetime或time模块分别获取当前时间戳的方法实例
2019/02/19 Python
python数据类型之间怎么转换技巧分享
2019/08/20 Python
Python数据分析模块pandas用法详解
2019/09/04 Python
Pycharm如何导入python文件及解决报错问题
2020/05/10 Python
keras绘制acc和loss曲线图实例
2020/06/15 Python
python基于socket模拟实现ssh远程执行命令
2020/12/05 Python
H&M旗下高端女装品牌:& Other Stories
2018/05/07 全球购物
Farfetch台湾官网:奢侈品牌时尚购物平台
2019/06/17 全球购物
益模软件Java笔试题
2012/03/27 面试题
审计局2014法制宣传日活动总结
2014/11/01 职场文书
董事长秘书岗位职责
2015/02/13 职场文书
NodeJs内存占用过高的排查实战记录
2021/05/10 NodeJs
详解CSS不定宽溢出文本适配滚动
2021/05/24 HTML / CSS
python中如何对多变量连续赋值
2021/06/03 Python
Python  lambda匿名函数和三元运算符
2022/04/19 Python