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 相关文章推荐
python实现自动登录人人网并访问最近来访者实例
Sep 26 Python
Python实现的简单算术游戏实例
May 26 Python
python列出目录下指定文件与子目录的方法
Jul 03 Python
python 上下文管理器使用方法小结
Oct 10 Python
Python查找数组中数值和下标相等的元素示例【二分查找】
Feb 13 Python
python 自定义装饰器实例详解
Jul 20 Python
Python实现报警信息实时发送至邮箱功能(实例代码)
Nov 11 Python
python队列原理及实现方法示例
Nov 27 Python
在ipython notebook中使用argparse方式
Apr 20 Python
Python并发请求下限制QPS(每秒查询率)的实现代码
Jun 05 Python
python3.4中清屏的处理方法
Jul 06 Python
python中requests库+xpath+lxml简单使用
Apr 29 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 特殊字符处理函数
2008/09/05 PHP
windwos下使用php连接oracle数据库的过程分享
2014/05/26 PHP
PHP Imagick完美实现图片裁切、生成缩略图、添加水印
2016/02/22 PHP
PHP文件及文件夹操作之创建、删除、移动、复制
2016/07/13 PHP
php写一个函数,实现扫描并打印出自定目录下(含子目录)所有jpg文件名
2017/05/26 PHP
完美的php分页类
2017/10/24 PHP
tp5(thinkPHP5)操作mongoDB数据库的方法
2018/01/20 PHP
php设计模式之策略模式应用案例详解
2019/06/17 PHP
Yii框架页面渲染操作实例详解
2019/07/19 PHP
jQuery的运行机制和设计理念分析
2011/04/05 Javascript
JSF中confirm弹出框的用法示例介绍
2014/01/07 Javascript
最丑的时钟效果!js canvas时钟制作方法
2016/08/15 Javascript
AngularJS实现与Java Web服务器交互操作示例【附demo源码下载】
2016/11/02 Javascript
ES6新特性之类(Class)和继承(Extends)相关概念与用法分析
2017/05/24 Javascript
Vue.js划分组件的方法
2017/10/29 Javascript
VUE DOM加载后执行自定义事件的方法
2018/09/07 Javascript
jQuery实现动态生成年月日级联下拉列表示例
2019/05/11 jQuery
Vue.js组件使用props传递数据的方法
2019/10/19 Javascript
小程序怎样让wx.navigateBack更好用的方法实现
2019/11/01 Javascript
[01:10:58]Spirit vs NB Supermajor小组赛 A组败者组决赛 BO3 第二场 6.2
2018/06/03 DOTA
浅述python中argsort()函数的实例用法
2017/03/30 Python
python实现在pandas.DataFrame添加一行
2018/04/04 Python
python删除文本中行数标签的方法
2018/05/31 Python
使用anaconda的pip安装第三方python包的操作步骤
2018/06/11 Python
python zip()函数使用方法解析
2019/10/31 Python
Python3.7基于hashlib和Crypto实现加签验签功能(实例代码)
2019/12/04 Python
python可视化 matplotlib画图使用colorbar工具自定义颜色
2020/12/07 Python
HTML5+Canvas+CSS3实现齐天大圣孙悟空腾云驾雾效果
2016/04/26 HTML / CSS
拥有超过850家商店的美国在线派对商店:Party City
2018/10/21 全球购物
免税水晶:Duty Free Crystal
2019/05/13 全球购物
淘宝店铺营销方案
2014/02/13 职场文书
妇女儿童发展规划实施方案
2014/03/16 职场文书
2014年会策划方案
2014/05/11 职场文书
2015年毕业实习工作总结
2015/05/29 职场文书
【HBU】数据库第四周 单表查询
2021/04/05 SQL Server
基于Python和openCV实现图像的全景拼接详细步骤
2021/10/05 Python