Объект 'super' не имеет атрибута '__eq__'

Когда я пытаюсь переопределить магический метод __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 не является дружественным к mixin. Переход к этому маршруту в порядке, но в других это может и не быть.

Любые предложения или информация о том, почему __eq__ работает таким образом, были бы замечательными.

Ответ 1

Как отмечено в ответе "Ответ", object() фактически не реализует __eq__ вообще для экземпляров (в python 2.7).

Вас обманывает тот факт, что object.__eq__ существует, полагая, что это должен быть метод, который проверяет, равны ли экземпляры объекта

Вместо этого object.__eq__ - фактически метод класса, унаследованный от type, который используется для проверки того, являются ли типы равными.

То есть обрабатывать выражения, такие как object == int и object == object.

Ответ 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