Объект '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