目录
一、NotImplemented它是什么?二、它有什么用?什么时候用?一、NotImplemented它是什么?
>>> type(NotImplemented)
NotImplemented
是Python
在内置命名空间中的六个常数之一。其他有False
、True
、None
、Ellipsis
和 debug
。和 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类型内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
X 关闭
X 关闭
- 15G资费不大降!三大运营商谁提供的5G网速最快?中国信通院给出答案
- 2联想拯救者Y70发布最新预告:售价2970元起 迄今最便宜的骁龙8+旗舰
- 3亚马逊开始大规模推广掌纹支付技术 顾客可使用“挥手付”结账
- 4现代和起亚上半年出口20万辆新能源汽车同比增长30.6%
- 5如何让居民5分钟使用到各种设施?沙特“线性城市”来了
- 6AMD实现连续8个季度的增长 季度营收首次突破60亿美元利润更是翻倍
- 7转转集团发布2022年二季度手机行情报告:二手市场“飘香”
- 8充电宝100Wh等于多少毫安?铁路旅客禁止、限制携带和托运物品目录
- 9好消息!京东与腾讯续签三年战略合作协议 加强技术创新与供应链服务
- 10名创优品拟通过香港IPO全球发售4100万股 全球发售所得款项有什么用处?