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连接MySQL、MongoDB、Redis、memcache等数据库的方法
Nov 15 Python
Python基础之函数用法实例详解
Sep 10 Python
Django中间件工作流程及写法实例代码
Feb 06 Python
python3解析库pyquery的深入讲解
Jun 26 Python
使用numba对Python运算加速的方法
Oct 15 Python
Python解决线性代数问题之矩阵的初等变换方法
Dec 12 Python
Python理解递归的方法总结
Jan 28 Python
Python3之字节串bytes与字节数组bytearray的使用详解
Aug 27 Python
PyTorch 随机数生成占用 CPU 过高的解决方法
Jan 13 Python
Python ADF 单位根检验 如何查看结果的实现
Jun 03 Python
Python爬取12306车次信息代码详解
Aug 12 Python
opencv实现图像几何变换
Mar 24 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/04/09 PHP
PHP下利用header()函数设置浏览器缓存的代码
2010/09/01 PHP
thinkphp3查询mssql数据库乱码解决方法分享
2014/02/11 PHP
PHP编译安装中遇到的两个错误和解决方法
2014/08/20 PHP
PHP程序中的文件锁、互斥锁、读写锁使用技巧解析
2016/03/21 PHP
php有效防止图片盗用、盗链的两种方法
2016/11/01 PHP
javascript网页关闭时提醒效果脚本
2008/10/22 Javascript
通过实例理解javascript中没有函数重载的概念
2015/06/03 Javascript
学习使用AngularJS文件上传控件
2016/02/16 Javascript
Javascript的比较汇总
2016/07/25 Javascript
JS控制div跳转到指定的位置的几种解决方案总结
2016/11/05 Javascript
JavaScript 数据类型详解
2017/03/13 Javascript
HTML中使背景图片自适应浏览器大小实例详解
2017/04/06 Javascript
JavaScript基于activexobject连接远程数据库SQL Server 2014的方法
2017/07/12 Javascript
如何使用JS在HTML中自定义字符串格式化
2017/07/20 Javascript
angular4 如何在全局设置路由跳转动画的方法
2017/08/30 Javascript
解决js ajax同步请求造成浏览器假死的问题
2018/01/18 Javascript
解决JS表单验证只有第一个IF起作用的问题
2018/12/04 Javascript
详解mpvue实现对苹果X安全区域的适配
2019/07/31 Javascript
Python实现FTP上传文件或文件夹实例(递归)
2017/01/16 Python
Python装饰器用法实例总结
2018/02/07 Python
python使用socket创建tcp服务器和客户端
2018/04/12 Python
TensorFlow Session会话控制&amp;Variable变量详解
2018/07/30 Python
详解基于Facecognition+Opencv快速搭建人脸识别及跟踪应用
2021/01/21 Python
Notino意大利:购买香水和化妆品
2018/11/14 全球购物
Linux的文件类型
2012/03/07 面试题
EJB timer的种类
2014/10/28 面试题
传媒专业推荐信范文
2013/11/23 职场文书
乡镇总工会学雷锋活动总结
2014/03/01 职场文书
捐款倡议书
2014/04/14 职场文书
向雷锋同志学习倡议书
2015/04/27 职场文书
2019年怎样写好导游词?
2019/07/02 职场文书
导游词之桂林山水
2019/09/20 职场文书
在K8s上部署Redis集群的方法步骤
2021/04/27 Redis
Pytorch中的学习率衰减及其用法详解
2021/06/05 Python
Python日志模块logging用法
2022/06/05 Python