11

当我尝试覆盖魔术方法__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而不是对supermixin 不友好。在我的情况下,走那条路是可以的,但在其他情况下可能不是。

任何建议或有关为什么__eq__以这种方式工作的信息都会很棒。

4

2 回答 2

4

正如 Will 的回答中所指出的,对于实例(在 python 2.7 中)object()实际上根本没有实现。__eq__

您被object.__eq__存在的事实所欺骗,认为它必须是一种检查对象实例是否相等的方法

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

也就是说,处理诸如object == intand之类的表达式object == object

于 2016-05-23T01:53:53.433 回答
2

这是因为object()实际上并没有实现__eq__(). 这里的“默认”是:

class A(object):
    def __eq__(self, other):
        if self is other:
            return True

        return self == other

但是,如果您尝试的方法有效,您实际上会检查self父类的实例是否为 equaled other。而且,它是同一个对象 ( self),所以它会。因此,与您的代码最接近的等价物实际上是:

class A(object):
    def __eq__(self, other):
        if self is other:
            return True

        return super(A, self) == other
于 2016-05-23T01:38:35.910 回答