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脚本将Bing的每日图片作为桌面的教程
May 04 Python
Python的Flask框架中的Jinja2模板引擎学习教程
Jun 30 Python
Python读取指定目录下指定后缀文件并保存为docx
Apr 23 Python
Python实现基于多线程、多用户的FTP服务器与客户端功能完整实例
Aug 18 Python
python3爬取各类天气信息
Feb 24 Python
python时间日期函数与利用pandas进行时间序列处理详解
Mar 13 Python
利用Python求阴影部分的面积实例代码
Dec 05 Python
Pyorch之numpy与torch之间相互转换方式
Dec 31 Python
python实现翻译word表格小程序
Feb 27 Python
python实现同一局域网下传输图片
Mar 20 Python
python Paramiko使用示例
Sep 21 Python
解析python中的jsonpath 提取器
Jan 18 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数据库解决方案分析介绍
2015/09/24 PHP
php实现XML和数组的相互转化功能示例
2017/02/08 PHP
jQuery 1.2.x 升? 1.3.x 注意事项
2009/05/06 Javascript
Jquery Validation插件防止重复提交表单的解决方法
2010/03/05 Javascript
JS关闭窗口与JS关闭页面的几种方法小结
2013/12/17 Javascript
Javascript异步编程模型Promise模式详细介绍
2014/05/08 Javascript
jQuery手动点击实现图片轮播特效
2020/04/20 Javascript
一波JavaScript日期判断脚本分享
2016/03/06 Javascript
原生JS京东轮播图代码
2017/03/22 Javascript
jQueryeasyui 中如何使用datetimebox 取两个日期间相隔的天数
2017/06/13 jQuery
使用prop解决一个checkbox选中后再次选中失效的问题
2017/07/05 Javascript
想用好React的你必须要知道的一些事情
2017/07/24 Javascript
[js高手之路]图解javascript的原型(prototype)对象,原型链实例
2017/08/28 Javascript
JS解决IOS中拍照图片预览旋转90度BUG的问题
2017/09/13 Javascript
nodejs实现的简单web服务器功能示例
2018/03/15 NodeJs
JavaScript树的深度优先遍历和广度优先遍历算法示例
2018/07/30 Javascript
微信上传视频文件提示(推荐)
2018/11/22 Javascript
Layui 数据表格批量删除和多条件搜索的实例
2019/09/04 Javascript
vue 通过 Prop 向子组件传递数据的实现方法
2020/10/30 Javascript
python脚本实现统计日志文件中的ip访问次数代码分享
2014/08/06 Python
Flask框架的学习指南之开发环境搭建
2016/11/20 Python
pyecharts绘制中国2020肺炎疫情地图的实例代码
2020/02/12 Python
python mysql自增字段AUTO_INCREMENT值的修改方式
2020/05/18 Python
如何基于Django实现上下文章跳转
2020/09/16 Python
python 用pandas实现数据透视表功能
2020/12/21 Python
Python实现邮件发送的详细设置方法(遇到问题)
2021/01/18 Python
opencv实现图像几何变换
2021/03/24 Python
高中毕业生自我鉴定例文
2013/12/29 职场文书
餐饮投资计划书
2014/04/25 职场文书
品牌服务方案
2014/06/03 职场文书
企业法人代表证明书
2014/09/27 职场文书
机关党员四风问题个人整改措施
2014/10/26 职场文书
2015年党员个人工作总结
2015/05/13 职场文书
教师远程培训心得体会
2016/01/09 职场文书
社区结对共建协议书
2016/03/23 职场文书
读后感怎么写?书写读后感的基本技巧!
2019/12/10 职场文书