gog*_*oji 7 python inheritance object superclass
我正在学习我的第一个计算科学课程,我们刚刚学习了类实现和继承.特别是,我们刚刚介绍了方法覆盖以及我们定义的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
Run Code Online (Sandbox Code Playgroud)
我期待结果(x == y),因为我理解它的默认值__eq__()是检查它们是否是相同的对象,而不是担心内容.哪个是False,x并且y具有相同的内容但是是不同的对象.第二个让我感到惊讶.
所以我的问题:我认为(x==y)并且x.__eq__(y)是同义词并且完全相同.为什么这些会产生不同的输出?为什么第二次有条件的回归NotImplemented呢?
该==操作相当于eq功能,这将在内部调用__eq__左操作的方法,如果存在的话,尝试确定平等.这不是它唯一会做的事情,如果__eq__不存在,就像这里的情况一样,它将进行其他检查,例如检查两者是否是同一个对象,还是__cmp__前Python 3.
简而言之,您的混淆源于此假设,这是不正确的:
我认为(x == y)和x .__ eq __(y)是同义词,并且完全相同
事实上,(x==y)并且operators.eq(x, y)是同义词,并且x.__eq__(y)是eq(x, y)将尝试检查的事情之一.
您从继承方法返回的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__直接调用时会向您显示标记.
| 归档时间: |
|
| 查看次数: |
125 次 |
| 最近记录: |