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计算最大优先级队列实例
Dec 18 Python
连接Python程序与MySQL的教程
Apr 29 Python
1分钟快速生成用于网页内容提取的xslt
Feb 23 Python
Flask之flask-session的具体使用
Jul 26 Python
浅谈Python编程中3个常用的数据结构和算法
Apr 30 Python
python3射线法判断点是否在多边形内
Jun 28 Python
用vue.js组件模拟v-model指令实例方法
Jul 05 Python
python+numpy实现的基本矩阵操作示例
Jul 19 Python
Python使用tkinter模块实现推箱子游戏
Oct 08 Python
3分钟看懂Python后端必须知道的Django的信号机制
Jul 26 Python
MATLAB 全景图切割及盒图显示的实现步骤
May 14 Python
python使用glob检索文件的操作
May 20 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设计模式之观察者模式的应用详解
2013/05/21 PHP
php制作中间带自己定义图片二维码的方法
2014/01/27 PHP
php随机显示图片的简单示例
2014/02/15 PHP
phalcon model在插入或更新时会自动验证非空字段的解决办法
2016/12/29 PHP
php设计模式之模板模式实例分析【星际争霸游戏案例】
2020/03/24 PHP
laravel使用数据库测试注意事项
2020/04/10 PHP
javascript 动态table添加colspan\rowspan 参数的方法
2009/07/25 Javascript
jQuery 动态酷效果实现总结
2009/12/27 Javascript
基于jquery的网站幻灯片切换效果焦点图代码
2013/09/15 Javascript
按下Enter焦点移至下一个控件的实现js代码
2013/12/11 Javascript
JS中的数组的sort方法使用示例
2014/01/22 Javascript
javascript限制文本框输入值类型的方法
2015/05/07 Javascript
javascript图片预加载完整实例
2015/12/10 Javascript
微信小程序中子页面向父页面传值实例详解
2017/03/20 Javascript
使用vue的v-for生成table并给table加上序号的实例代码
2017/10/27 Javascript
垃圾回收器的相关知识点总结
2018/05/13 Javascript
webpack4之SplitChunksPlugin使用指南
2018/06/12 Javascript
简单了解Javscript中兄弟ifream的方法调用
2019/06/17 Javascript
Vue实现移动端拖拽交换位置
2020/07/29 Javascript
python实现转圈打印矩阵
2019/03/02 Python
matplotlib相关系统目录获取方式小结
2021/02/03 Python
20佳惊艳的HTML5应用程序示例分享
2011/05/03 HTML / CSS
HTML5中原生的右键菜单创建方法
2016/06/28 HTML / CSS
正宗的日本零食和糖果订阅盒:Bokksu
2019/11/21 全球购物
意大利顶级奢侈品电商:LUISAVIAROMA(支持中文)
2020/05/26 全球购物
采购主管工作职责
2013/12/12 职场文书
企业人事任命书
2014/06/05 职场文书
晋江市委常委班子四风问题整改工作方案
2014/10/26 职场文书
2014年团工作总结
2014/11/27 职场文书
先进集体事迹材料范文
2014/12/25 职场文书
股份转让协议书范本
2015/01/27 职场文书
2016公司中秋节寄语
2015/12/07 职场文书
销售会议开幕词
2016/03/04 职场文书
python xlwt模块的使用解析
2021/04/13 Python
动画电影《龙珠超 超级英雄》延期上映
2022/03/20 日漫
Nginx+Tomcat负载均衡多实例详解
2022/04/11 Servers