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 控制语句
Nov 03 Python
总结python爬虫抓站的实用技巧
Aug 09 Python
Python实现按学生年龄排序的实际问题详解
Aug 29 Python
Python基础教程之内置函数locals()和globals()用法分析
Mar 16 Python
Python时间和字符串转换操作实例分析
Mar 16 Python
基于python实现百度翻译功能
May 09 Python
python实现爬虫抓取小说功能示例【抓取金庸小说】
Aug 09 Python
Python实现生成密码字典的方法示例
Sep 02 Python
python3用PyPDF2解析pdf文件,用正则匹配数据方式
May 12 Python
浅谈keras保存模型中的save()和save_weights()区别
May 21 Python
Python GUI编程之tkinter 关于 ttkbootstrap 的使用详解
Mar 03 Python
python 安全地删除列表元素的方法
Mar 16 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控制用户的浏览器--ob*函数的使用说明
2007/03/16 PHP
php下连接mssql2005的代码
2011/01/17 PHP
PHP获取MSN好友列表类的实现代码
2013/06/23 PHP
解析php防止form重复提交的方法
2013/07/01 PHP
JS 实现获取打开一个界面中输入的值
2013/03/19 Javascript
javascript将url中的参数加密解密代码
2014/11/17 Javascript
jQuery实现简单的tab标签页效果
2016/09/12 Javascript
判断颜色是否合法的正则表达式(详解)
2017/05/03 Javascript
关于javascript获取内联样式与嵌入式样式的实例
2017/06/01 Javascript
使用nodeJs来安装less及编译less文件为css文件的方法
2017/11/20 NodeJs
详解如何使用 vue-cli 开发多页应用
2017/12/16 Javascript
Angular6 用户自定义标签开发的实现方法
2019/01/08 Javascript
Vue实现类似Spring官网图片滑动效果方法
2019/03/01 Javascript
js实现简单点赞操作
2020/03/17 Javascript
Vue this.$router.push(参数)实现页面跳转操作
2020/09/09 Javascript
[04:16]DOTA2英雄梦之声_第09期_斧王
2014/06/21 DOTA
在Django的模板中使用认证数据的方法
2015/07/23 Python
使用python实现ANN
2017/12/20 Python
Django对数据库进行添加与更新的例子
2019/07/12 Python
python接口调用已训练好的caffe模型测试分类方法
2019/08/26 Python
python或C++读取指定文件夹下的所有图片
2019/08/31 Python
基于matplotlib xticks用法详解
2020/04/16 Python
python让函数不返回结果的方法
2020/06/22 Python
详解python安装matplotlib库三种失败情况
2020/07/28 Python
python基于opencv 实现图像时钟
2021/01/04 Python
美国电子产品购物网站:BuyDig.com
2020/06/17 全球购物
Java语言程序设计测试题选择题部分
2014/04/03 面试题
面临毕业的毕业生自荐书范文
2014/02/05 职场文书
《商鞅南门立木》教学反思
2014/02/16 职场文书
拉拉队口号
2014/06/16 职场文书
2015年班级元旦晚会活动总结
2014/11/28 职场文书
劳动保障个人工作总结
2015/03/04 职场文书
交通安全教育主题班会
2015/08/12 职场文书
5种 JavaScript 方式实现数组扁平化
2021/10/05 Javascript
《地。-关于地球的运动-》单行本第七集上市,小说家朝井辽献上期待又害怕的推荐文
2022/03/31 日漫
Python os和os.path模块详情
2022/04/02 Python