当我尝试覆盖魔术方法__eq__
,并使用super
访问object
中找到的基本方法时,我收到错误消息。这不是一个错误,但它肯定感觉像一个:
class A(object):
def __eq__(self, other):
return super(A, self).__eq__(other)
A() == 0
# raises AttributeError: 'super' object has no attribute '__eq__'
这是不直观的,因为object.__eq__
存在,但对于class A(object): pass
则不然。如果我没有误将__eq__
转到is
支票,那么这可能就是解决方法,但使用is
代替super
并不是混合友好的。在我的情况下,这条路线是可以的,但在其他情况下它可能不是。
任何有关__eq__
以这种方式运作的建议或信息都会很棒。
答案 0 :(得分:4)
如Will的回答所述,object()
实际上并没有为实例实现__eq__
(在python 2.7中)。
你被object.__eq__
认为它必须是一种检查对象的实例是否相等的方法而被欺骗的事实被欺骗了
相反,object.__eq__
实际上是一个继承自type
的类方法,用于检查类型是否相等。
即,处理object == int
和object == object
等表达式。
答案 1 :(得分:2)
这是因为object()
实际上并未实现__eq__()
。这里的“默认”是:
class A(object):
def __eq__(self, other):
if self is other:
return True
return self == other
但是,如果您尝试的工作有效,您实际上会检查父类的self
实例是否等于other
。并且,它是相同的对象(self
),所以它会。所以最接近你的代码实际上是:
class A(object):
def __eq__(self, other):
if self is other:
return True
return super(A, self) == other