Python编程中内置的NotImplemented类型的用法


Posted in Python onMarch 23, 2022

一、NotImplemented它是什么?

>>> type(NotImplemented)
<type 'NotImplementedType'>

NotImplementedPython在内置命名空间中的六个常数之一。其他有FalseTrueNoneEllipsisdebug。和 Ellipsis很像,[NotImplemented] 能被重新赋值(覆盖)。对它赋值,甚至改变属性名称, 不会产生 SyntaxError。所以它不是一个真正的“真”常数。当然,我们应该永远不改变它。

但是为了完整性:

>>> None = 'hello'
...
SyntaxError: can't assign to keyword
>>> NotImplemented
NotImplemented
>>> NotImplemented = 'do not'
>>> NotImplemented
'do not'

二、它有什么用?什么时候用?

NotImplemented 是个特殊值,它能被二元特殊方法返回(比如__eq__()、 lt() 、 add() 、 rsub() 等),表明某个类型没有像其他类型那样实现这些操作。同样,它或许会被原地处理(in place)的二元特殊方法返回(比如__imul__()、iand()等)。

还有,它的实际值为True:

>>> bool(NotImplemented)
True

你也许会问自己,“但我认为当这个操作没有实现时,我应该产生个NotImpementedError”。我们会看些例子,关于为什么当实现二元特殊方法时不是这么回事儿。

让我们看看NotImplemented常数的用法,通过__eq__()对于两个非常基本(且没用)的类 A 和 B 的编码。对于这个简单的例子,为了避免干扰,不会实现__ne__() ,但是总的说来,每次实现__eq__() 时, ne()也应该被实现,除非,有个足够充分的理由去不实现它。

# example.py
  
class A(object):
  def __init__(self, value):
    self.value = value
  
  def __eq__(self, other):
    if isinstance(other, A):
      print('Comparing an A with an A')
      return other.value == self.value
    if isinstance(other, B):
      print('Comparing an A with a B')
      return other.value == self.value
    print('Could not compare A with the other class')
    return NotImplemented
  
class B(object):
  def __init__(self, value):
    self.value = value
  
  def __eq__(self, other):
    if isinstance(other, B):
      print('Comparing a B with another B')
      return other.value == self.value
    print('Could not compare B with the other class')
    return NotImplemented

现在,在解释器中:

>>> from example import A, B
>>> a1 = A(1)
>>> b1 = B(1)

我们现在可以实验下对于 eq() 不同的调用,看看发生了什么。

作为提醒,在Python中,a == b会调用a.eq(b):

>>> a1 == a1
Comparing an A with an A
True

正如所望,a1等于a1(自己),使用类A中的__eq__()来进行这个比较的。

比较b1和它自己也会产生类似结果:

>>> b1 == b1
Comparing a B with another B
True

现在,那要是我们比较a1和b1呢?由于在A的__eq__()会检查other是不是B的一个实例,我们想要a1.eq(b1)去处理这个比较并返回True:

>>> a1 == b1
Comparing an A with a B
True

就是这样。现在,如果我们比较b1和a1(即调用b1.eq(a1)),我们会想要返回NotImplemented。这是因为B的__eq__()只和其他B的实例进行比较。

来看看发生了什么:

>>> b1 == a1
Could not compare B against the other class
Comparing an A with a B
True

聪明!b1.eq(a1)方法返回NotImplemented,这样会导致调用A中的__eq__()方法。而且由于在A中的__eq__()定义了A和B之间的比较,所以就得到了正确的结果(True)。

这就是返回了NotImplemented的所做的。NotImplemented告诉运行时,应该让其他对象来完成某个操作。在表达b1 == a1中,b1.eq(a1)返回了NotImplemented,这说明Python试着用a1.eq(b1)。由于a1足够可以返回True,因此这个表达可以成功。如果A中的__eq__()也返回NotImplemented,那么运行时会退化到使用内置的比较行为,即比较对象的标识符(在CPython中,是对象在内存中的地址)。

注意:如果在调用b1.eq(a1)时抛出NotImpementedError,而不进行处理,就会中断代码的执行。而NotImplemented无法抛出,仅仅是用来进一步测试是否有其他方法可供调用。

到此这篇关于Python编程中内置的NotImplemented类型的用法的文章就介绍到这了,更多相关Python内置NotImplemented类型内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
centos 下面安装python2.7 +pip +mysqld
Nov 18 Python
Python迭代和迭代器详解
Nov 10 Python
Python用户推荐系统曼哈顿算法实现完整代码
Dec 01 Python
Python2.7下安装Scrapy框架步骤教程
Dec 22 Python
python中numpy的矩阵、多维数组的用法
Feb 05 Python
Python利用heapq实现一个优先级队列的方法
Feb 03 Python
Django REST framework 分页的实现代码
Jun 19 Python
python计算n的阶乘的方法代码
Oct 25 Python
Pytorch 数据加载与数据预处理方式
Dec 31 Python
Django项目创建及管理实现流程详解
Oct 13 Python
python中pdb模块实例用法
Jan 15 Python
Pytorch 图像变换函数集合小结
Feb 01 Python
pandas进行数据输入和输出的方法详解
Mar 23 #Python
基于Python编写简易版的天天跑酷游戏的示例代码
Python中的嵌套循环详情
Mar 23 #Python
python装饰器代码解析
Mar 23 #Python
基于Python实现将列表数据生成折线图
Python必备技巧之字符数据操作详解
Pytorch中使用ImageFolder读取数据集时忽略特定文件
Mar 23 #Python
You might like
php设计模式 Bridge (桥接模式)
2011/06/26 PHP
php数字转汉字代码(算法)
2011/10/08 PHP
Smarty模板学习笔记之Smarty简介
2014/05/20 PHP
转自Jquery官方 jQuery1.1.3发布,速度提升800%,体积保持20K
2007/08/19 Javascript
jquery 页面全选框实践代码
2010/04/02 Javascript
js+css实现tab菜单切换效果的方法
2015/01/20 Javascript
javascript实现相同事件名称,不同命名空间的调用方法
2015/06/26 Javascript
JS实现无缝循环marquee滚动效果
2017/05/22 Javascript
JS实现的A*寻路算法详解
2018/12/14 Javascript
javascript原型链学习记录之继承实现方式分析
2019/05/01 Javascript
Node.js 在本地生成日志文件的方法
2020/02/07 Javascript
小程序瀑布流组件实现翻页与图片懒加载
2020/05/19 Javascript
[02:35]DOTA2超级联赛专访XB 难忘一年九冠称王
2013/06/20 DOTA
[02:34]2016完美“圣”典风云人物:BurNIng专访
2016/12/10 DOTA
Python的迭代器和生成器使用实例
2015/01/14 Python
Python查询阿里巴巴关键字排名的方法
2015/07/08 Python
浅谈python中的__init__、__new__和__call__方法
2017/07/18 Python
Python基于hashlib模块的文件MD5一致性加密验证示例
2018/02/10 Python
python 删除指定时间间隔之前的文件实例
2018/04/24 Python
Python3中在Anaconda环境下安装basemap包
2018/10/21 Python
python+mysql实现学生信息查询系统
2019/02/21 Python
Python嵌套式数据结构实例浅析
2019/03/05 Python
详解用pyecharts Geo实现动态数据热力图城市找不到问题解决
2019/06/26 Python
解决Django中修改js css文件但浏览器无法及时与之改变的问题
2019/08/31 Python
使用opencv中匹配点对的坐标提取方式
2020/06/04 Python
如何使用canvas绘制可移动网格的示例代码
2020/12/14 HTML / CSS
日本一家专门经营各种箱包的大型网站:Traveler Store
2016/08/03 全球购物
玩具反斗城天猫官方旗舰店:享誉全球的玩具店
2017/10/10 全球购物
全球最大的在线橄榄球商店:Lovell Rugby
2018/05/20 全球购物
大学学习生活感言
2014/01/18 职场文书
协议书怎么写
2014/04/21 职场文书
小学教师求职信范文
2015/03/20 职场文书
举起手来观后感
2015/06/09 职场文书
开学典礼致辞
2015/07/29 职场文书
2019餐饮行业创业计划书!
2019/06/27 职场文书
基于python的matplotlib制作双Y轴图
2021/04/20 Python