我有一个类MyClass
,它包含两个成员变量foo
和bar
:
class MyClass:
def __init__(self, foo, bar):
self.foo = foo
self.bar = bar
我有这个类的两个实例,每个实例都有相同的 foo
和 bar
值:
x = MyClass('foo', 'bar')
y = MyClass('foo', 'bar')
但是,当我比较它们是否相等时,Python 返回 False
:
>>> x == y
False
如何让 python 认为这两个对象相等?
最佳答案
你应该实现方法__eq__
:
class MyClass:
def __init__(self, foo, bar):
self.foo = foo
self.bar = bar
def __eq__(self, other):
if not isinstance(other, MyClass):
# don't attempt to compare against unrelated types
return NotImplemented
return self.foo == other.foo and self.bar == other.bar
现在输出:
>>> x == y
True
请注意,实现 __eq__
将自动使您的类的实例不可散列,这意味着它们不能存储在集合和字典中。如果您没有对不可变类型进行建模(即,如果属性 foo
和 bar
可能会在对象的生命周期内更改值),那么建议您只保留您的实例不可散列。
如果您正在为不可变类型建模,您还应该实现数据模型 Hook __hash__
:
class MyClass:
...
def __hash__(self):
# necessary for instances to behave sanely in dicts and sets.
return hash((self.foo, self.bar))
一般的解决方案,例如循环遍历 __dict__
并比较值的想法,是不可取的 - 它永远不可能真正通用,因为 __dict__
可能具有不可比较或不可散列包含的类型。
注意:请注意,在 Python 3 之前,您可能需要使用 __cmp__
而不是 __eq__
。 Python 2 用户可能还想实现 __ne__
,因为在 Python 2 中不会自动创建不等式的合理默认行为(即反转等式结果)。
关于python - 通过属性比较对象实例是否相等,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1227121/