浅析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 相关文章推荐
python3 拼接字符串的7种方法
Sep 12 Python
python使用epoll实现服务端的方法
Oct 16 Python
Python数据预处理之数据规范化(归一化)示例
Jan 08 Python
利用python实现对web服务器的目录探测的方法
Feb 26 Python
基于wxPython的GUI实现输入对话框(2)
Feb 27 Python
详解Python爬取并下载《电影天堂》3千多部电影
Apr 26 Python
python抓取需要扫微信登陆页面
Apr 29 Python
python多进程读图提取特征存npy
May 21 Python
Python爬虫 批量爬取下载抖音视频代码实例
Aug 16 Python
python3实现在二叉树中找出和为某一值的所有路径(推荐)
Dec 26 Python
python如何利用paramiko执行服务器命令
Nov 07 Python
Python+uiautomator2实现自动刷抖音视频功能
Apr 29 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
UCenter中的一个可逆加密函数authcode函数代码
2010/07/20 PHP
PHP中数组的三种排序方法分享
2012/05/07 PHP
PHP写的获取各搜索蜘蛛爬行记录代码
2012/08/21 PHP
基于PHP服务端图片生成缩略图的方法详解
2013/06/20 PHP
Codeigniter出现错误提示Error with CACHE directory的解决方案
2014/06/12 PHP
Linux中为php配置伪静态
2014/12/17 PHP
基于php实现随机合并数组并排序(原排序)
2015/11/26 PHP
JavaScript QueryString解析类代码
2010/01/17 Javascript
利用jquery.qrcode在页面上生成二维码且支持中文
2014/02/12 Javascript
JavaScript判断表单中多选框checkbox选中个数的方法
2015/08/17 Javascript
JS定义类的六种方式详解
2016/05/12 Javascript
Angular使用ng-messages与PHP进行表单数据验证
2016/12/28 Javascript
浅谈js中的变量名和函数名重名
2017/02/13 Javascript
《javascript设计模式》学习笔记四:Javascript面向对象程序设计链式调用实例分析
2020/04/07 Javascript
微信小程序对图片进行canvas压缩的方法示例详解
2020/11/12 Javascript
[02:41]辉夜杯现场一家三口 “我爸玩风行 我玩血魔”
2015/12/27 DOTA
[36:09]Secret vs VG 2019国际邀请赛淘汰赛 败者组 BO3 第一场 8.24
2019/09/10 DOTA
python算法演练_One Rule 算法(详解)
2017/05/17 Python
python+selenium实现163邮箱自动登陆的方法
2017/12/31 Python
微信跳一跳自动运行python脚本
2018/01/08 Python
使用Python从零开始撸一个区块链
2018/03/14 Python
Python常见内置高效率函数用法示例
2018/07/31 Python
PyQt5 QListWidget选择多项并返回的实例
2019/06/17 Python
Django多数据库的实现过程详解
2019/08/01 Python
python中count函数简单用法
2020/01/05 Python
python str字符串转uuid实例
2020/03/03 Python
python实现手势识别的示例(入门)
2020/04/15 Python
客户代表实习人员自我鉴定
2013/09/27 职场文书
客服工作职责
2013/12/11 职场文书
满月酒答谢词
2014/01/14 职场文书
《老山界》教学反思
2014/04/08 职场文书
初中学生评语大全
2014/04/24 职场文书
购房委托书
2014/10/15 职场文书
优秀教师先进材料
2014/12/16 职场文书
2016中学教师读书心得体会
2016/01/13 职场文书
Vue接口封装的完整步骤记录
2021/05/14 Vue.js