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 相关文章推荐
在Django的模型中执行原始SQL查询的方法
Jul 21 Python
Python引用类型和值类型的区别与使用解析
Oct 17 Python
解决python opencv无法显示图片的问题
Oct 28 Python
Python3.4解释器用法简单示例
Mar 22 Python
使用python进行广告点击率的预测的实现
Jul 04 Python
python实现图片九宫格分割
Mar 07 Python
Python搭建代理IP池实现获取IP的方法
Oct 27 Python
django实现用户注册实例讲解
Oct 30 Python
python的json中方法及jsonpath模块用法分析
Dec 06 Python
Python tornado上传文件的功能
Mar 26 Python
如何基于python实现年会抽奖工具
Oct 20 Python
Python实现自动装机功能案例分析
Oct 22 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 日常开发小技巧
2009/09/23 PHP
PHP 引用文件技巧
2010/03/02 PHP
PHP发明人谈MVC和网站设计架构 貌似他不支持php用mvc
2011/06/04 PHP
php 利用socket发送HTTP请求(GET,POST)
2015/08/24 PHP
php array_key_exists() 与 isset() 的区别
2016/10/24 PHP
visual studio code 调试php方法(图文详解)
2017/09/15 PHP
php用wangeditor3实现图片上传功能
2019/08/22 PHP
php进程(线程)通信基础之System V共享内存简单实例分析
2019/11/09 PHP
风吟的小型JavaScirpt库 (FY.JS).
2010/03/09 Javascript
JavaScript中的apply()方法和call()方法使用介绍
2012/07/25 Javascript
js鼠标点击事件在各个浏览器中的写法及Event对象属性介绍
2013/01/24 Javascript
jqueyr判断checkbox组的选中(示例代码)
2013/11/08 Javascript
使用JS取得焦点(focus)元素代码
2014/03/22 Javascript
使用JavaScript+canvas实现图片裁剪
2015/01/30 Javascript
js实现背景图片感应鼠标变化的方法
2015/02/28 Javascript
原生JS实现LOADING效果
2015/03/16 Javascript
学习掌握JavaScript中this的使用技巧
2016/08/29 Javascript
JS绘制微信小程序画布时钟
2016/12/24 Javascript
nodejs 图解express+supervisor+ejs的用法(推荐)
2017/09/08 NodeJs
vue获取input输入值的问题解决办法
2017/10/17 Javascript
微信小程序实现图片滚动效果示例
2018/12/05 Javascript
微信小程序防止多次点击跳转和防止表单组件输入内容多次验证功能(函数防抖)
2019/09/19 Javascript
[01:14:55]EG vs Spirit Supermajor 败者组 BO3 第三场 6.4
2018/06/05 DOTA
Python多线程实例教程
2014/09/06 Python
Python探索之爬取电商售卖信息代码示例
2017/10/27 Python
Python Pillow Image Invert
2019/01/22 Python
在tensorflow下利用plt画论文中loss,acc等曲线图实例
2020/06/15 Python
基于python判断字符串括号是否闭合{}[]()
2020/09/21 Python
python自动化办公操作PPT的实现
2021/02/05 Python
使用phonegap克隆和删除联系人的实现方法
2017/03/31 HTML / CSS
欧缇丽美国官网:Caudalie美国
2016/12/31 全球购物
Yves Rocher伊夫·黎雪美国官网:法国始创植物美肌1959
2019/01/09 全球购物
基层党支部整改方案
2014/10/25 职场文书
2015年秋季开学典礼校长致辞
2015/07/16 职场文书
MySQL的Query Cache图文详解
2021/07/01 MySQL
pd.drop_duplicates删除重复行的方法实现
2022/06/16 Python