When I try to override the magic method __eq__
, and use super
to access the base method found in object
, I get an error. There's no way this is a bug, but it sure feels like one:
class A(object):
def __eq__(self, other):
return super(A, self).__eq__(other)
A() == 0
# raises AttributeError: 'super' object has no attribute '__eq__'
This is unintuitive because object.__eq__
exists, but for class A(object): pass
it doesn't. If I'm not mistaken __eq__
resorts to an is
check, so that may be the workaround here, but using is
instead of super
isn't mixin friendly. Going that route is ok in my case, but in others it might not be.
Any suggestions, or info on why __eq__
works this way would be great.
As noted in Will's answer, object()
does not actually implement __eq__
at all for instances (in python 2.7).
You are being deceived by the fact that object.__eq__
exists into believing it must be a method that checks if instances of object are equal
Instead, object.__eq__
is actually a class method, inherited from type
, that is used to check if types are equal.
That is, to handle expressions such as object == int
and object == object
.
This is because object()
doesn't actually implement an __eq__()
. The "default" here would be:
class A(object):
def __eq__(self, other):
if self is other:
return True
return self == other
But, if what you're attempting had worked, you would actually be checking whether the self
instance of the parent class equaled other
. And, it's the same object (self
), so it would. So the closest equivalent of your code would actually be:
class A(object):
def __eq__(self, other):
if self is other:
return True
return super(A, self) == other
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With