在编写自定义类时,通过==
和!=
操作符允许等价通常是很重要的。在Python中,这可以通过分别实现__eq__
和__ne__
特殊方法实现。我发现最简单的方法是以下方法:
class Foo:
def __init__(self, item):
self.item = item
def __eq__(self, other):
if isinstance(other, self.__class__):
return self.__dict__ == other.__dict__
else:
return False
def __ne__(self, other):
return not self.__eq__(other)
你知道更优雅的方法吗?你知道使用上面比较__abc0的方法有什么特别的缺点吗?
请注意:一点澄清——当__eq__
和__ne__
未定义时,你会发现这样的行为:
>>> a = Foo(1)
>>> b = Foo(1)
>>> a is b
False
>>> a == b
False
也就是说,a == b
的计算结果为False
,因为它实际上运行a is b
,这是一个身份测试(即,“a
是否与b
是同一个对象?”)。
当__eq__
和__ne__
被定义时,你会发现这样的行为(这是我们所追求的行为):
>>> a = Foo(1)
>>> b = Foo(1)
>>> a is b
False
>>> a == b
True