'super'对象没有属性'__eq__'

时间:2016-05-23 01:11:11

标签: python python-2.7 super python-object

当我尝试覆盖魔术方法__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__以这种方式运作的建议或信息都会很棒。

2 个答案:

答案 0 :(得分:4)

如Will的回答所述,object()实际上并没有为实例实现__eq__(在python 2.7中)。

你被object.__eq__认为它必须是一种检查对象的实例是否相等的方法而被欺骗的事实被欺骗了

相反,object.__eq__实际上是一个继承自type的类方法,用于检查类型是否相等。

即,处理object == intobject == 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