'super' 对象没有属性 '__eq__'
'super' object has no attribute '__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
对混合不友好。走那条路对我来说没问题,但对其他人来说可能就不行了。
关于 __eq__
为什么以这种方式工作的任何建议或信息都很好。
这是因为 object()
实际上并未实现 __eq__()
。这里的 "default" 将是:
class A(object):
def __eq__(self, other):
if self is other:
return True
return self == other
但是,如果您尝试的方法奏效,您实际上是在检查父 class 的 self
实例是否等于 other
。而且,它是同一个对象 (self
),所以它会。因此,与您的代码最接近的等效项实际上是:
class A(object):
def __eq__(self, other):
if self is other:
return True
return super(A, self) == other
如 Will 的回答所述,object()
实际上根本没有实现 __eq__
(在 python 2.7 中)。
您被 object.__eq__
存在的事实所欺骗,相信它一定是一种检查对象的 实例 是否相等的方法
相反,object.__eq__
实际上是一个class方法,继承自type
,用于检查类型是否相等。
即处理object == int
、object == 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__
为什么以这种方式工作的任何建议或信息都很好。
这是因为 object()
实际上并未实现 __eq__()
。这里的 "default" 将是:
class A(object):
def __eq__(self, other):
if self is other:
return True
return self == other
但是,如果您尝试的方法奏效,您实际上是在检查父 class 的 self
实例是否等于 other
。而且,它是同一个对象 (self
),所以它会。因此,与您的代码最接近的等效项实际上是:
class A(object):
def __eq__(self, other):
if self is other:
return True
return super(A, self) == other
如 Will 的回答所述,object()
实际上根本没有实现 __eq__
(在 python 2.7 中)。
您被 object.__eq__
存在的事实所欺骗,相信它一定是一种检查对象的 实例 是否相等的方法
相反,object.__eq__
实际上是一个class方法,继承自type
,用于检查类型是否相等。
即处理object == int
、object == object
等表达式。