我正在上我的第一门计算机科学课程,并且我们刚刚学习了有关类实现和继承的知识。特别是,我们仅介绍了方法重写以及object
默认情况下定义的类如何从超类继承。作为尝试这种特殊情况的示例之一,我使用了以下代码:
class A:
def __init__(self, i):
self.i = i
def __str__(self):
return "A"
# Commenting out these two lines to not override __eq__(), just use the
# default from our superclass, object
#def __eq__(self, other):
#return self.i == other.i
x = A(2)
y = A(2)
>>>print(x == y)
False
>>>print(x.__eq__(y))
NotImplemented
我期望从中得到结果(x == y)
,因为据我所知,默认值__eq__()
是检查它们是否是相同的对象,而不用担心内容。是False
,x
并且y
具有相同的内容,但是是不同的对象。第二个让我感到惊讶。
所以我的问题是:我以为(x==y)
并且x.__eq__(y)
是同义的,并且拨打了完全相同的电话。为什么这些产生不同的输出?为什么第二个条件返回NotImplemented
呢?
您从继承的方法返回的NotImplemented
值__eq__
是一个特殊的内置值,在Python中用作哨兵。可以通过__magic__
实现数学运算符或比较运算符的方法返回它,以指示该类不支持尝试的运算符(具有提供的参数)。
这比引发异常更为有用,因为它允许Python退回到其他选项来解决操作员的使用。例如,如果您这样做x + y
,Python将首先尝试运行x.__add__(y)
。如果返回NotImplemented
,则接下来将尝试“反向”版本,y.__radd__(x)
如果它y
是比x
现在更复杂的类型,则该版本可能会起作用。
如果您要询问的是,x == y
Python首先会尝试x.__eq__(y)
,然后会尝试,y.__eq__(x)
最后是x is y
(将始终评估为布尔值)。由于object.__eq__
回报率NotImplemented
在所有情况下,你的类回落到识别比当你使用真正的运营商,但你表演的NotImplemented
哨兵,当你调用__eq__
直接。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句