浅析python继承与多重继承
作者:laozhang 发布时间:2021-08-28 08:19:35
记住以下几点:
直接子类化内置类型(如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>


猜你喜欢
- 1. Jupyter 默认目录调整首先要找到jupyter生成的配置文件 jupyter_notebook_config.py 。如果没有,
- 网上有很多方法能够过去到IP地址归属地的脚本,但是我发现淘宝IP地址库的信息更详细些,所以用shell写个脚本来处理日常工作中一些IP地址分
- CSS处理斜角导航条的一个例子,这个是写着测试用的。暂没有实际的应用。斜角处理比较麻烦,主要有两个地方。1、图片处理。2、负数的理解。这两个
- 格式化输出:format()format():把传统的%替换为{}来实现格式化输出1.使用位置参数:就是在字符串中把需要输出的变量值用{}来
- 要将xian80地理坐标系转换成投影坐标系:xian1980 = """GEOGCS["GCS_Xi
- 使用MySQL Administrator 登录,报错: Either the server service or the configur
- 回文数字是很有意思的数字,不管从最高位开始念,还是从个位开始念,最终结果都一样,有一种对称美。下面是回文数字的函数判断方式:def is_p
- 抽象特点Python 一切皆对象,基于此概念,对 类 class 有以下特点:类与实例的属性类对象创建可选择定义类属性,创建实例对象时,实例
- 导入模块模块通常为单独的.py文件,可以用import直接引用,可以作为模块的文件类型有.py、.pyo、.pyc、.pyd、.so、.dl
- 前端使用ajax进行数据交互时:$.ajax({ cache: false, type: "POST", url: {%
- 1.文件的读取和显示方法1: f=open(r'G:\2.txt') print f.read()&nb
- 这是一张灵异事件图。。。开个玩笑,这就是一张普通的图片。毫无疑问,上面的那副图画看起来像一幅电脑背景图片。这些都归功于我的妹妹,她能够将一些
- re正则表达式模块还包括一些有用的操作正则表达式的函数。下面主要介绍compile函数。 定义: compile(pattern[,flag
- 在许多基于基础表的查询中,为了满足一个条件,往往需要对另一个表进行联接。在这种情况下, 使用EXISTS(或NOT EX
- 主要使用IE各个阶段实现的一些方法,从中也可以看出IE的发展史。暂时提供到IE4的判定。var isIE = window.ActiveXO
- 有的时候,操作大文件,或者取数,要很久,我们给脚本首尾添加一段代码就知道,这段代码整体的大致运行时间了。import timestart =
- 本文实例为大家分享了python画中国国旗的具体代码,供大家参考,具体内容如下# author : momoimport turtle#中国
- 什么是掩膜(mask)在numpy中,有一个模块叫做ma,这个模块几乎复制了numpy里面的所有函数,当然底层里面都换成了对自己定义的新的数
- 操作系统 : Windows 10_x64 [版本 10.0.19042.685]pjsip版本 : 2.10pjsip官网:https:/
- 最近要做一个侧边目录的功能,没有找到类似的组件,索性自己写了一个供大家参考vue-side-catalog一个基于vue的侧边目录组件。源码