python - 通过属性比较对象实例是否相等

标签 python equality

我有一个类MyClass,它包含两个成员变量foobar:

class MyClass:
    def __init__(self, foo, bar):
        self.foo = foo
        self.bar = bar

我有这个类的两个实例,每个实例都有相同的 foobar 值:

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__ 将自动使您的类的实例不可散列,这意味着它们不能存储在集合和字典中。如果您没有对不可变类型进行建模(即,如果属性 foobar 可能会在对象的生命周期内更改值),那么建议您只保留您的实例不可散列。

如果您正在为不可变类型建模,您还应该实现数据模型 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/

相关文章:

python - 模板语法错误 : widget_tweaks is not a valid library django

python - 使用 Python 获取 'real' Google 结果

python - Django:按用户过滤 ModelChoiceField

haskell - Haskell 中用于比较列表的 Eq 问题

ruby - 当您只关心相交键时,如何在 Ruby 中轻松测试哈希相等性?

python - Jupyter 笔记本中未显示的绘图

javascript - Python 和 D3.js 仪表板交叉过滤器热图

java - 如何在 Java 中比较字符串?

python - 如何检查 Python 2.5 中的类相等性?

Python 3 == 运算符