如何在Python类中实现优雅的相等比较?

Mary-Kate Olsen
发布: 2024-11-08 08:44:01
原创
434 人浏览过

How to Achieve Elegant Equality Comparisons in Python Classes?

在 Python 类中支持相等(“等价”)的优雅方法

在面向对象编程中,定义自定义类的对象之间的相等检查通常至关重要。 Python 通过实现特殊方法 eq 和 __ne__ 来实现这一点,分别用于等价和不等式比较。

一种既定方法是比较 dict 属性两个对象:

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
登录后复制

但是,请考虑以下更简单的方法:

class Number:

    def __init__(self, number):
        self.number = number

    def __eq__(self, other):
        return isinstance(other, Number) and self.number == other.number
登录后复制

这种简洁的方法消除了复杂的 dict 比较的需要,使其成为一种优雅的方法

此外,它无缝地处理子类化,确保可交换且一致的等式检查:

class SubNumber(Number):
    pass

n1 = Number(1)
n2 = Number(1)
n3 = SubNumber(1)
n4 = SubNumber(4)

print(n1 == n2) # True
print(n2 == n1) # True
print(n1 == n3) # True
print(n1 != n4) # True
print(len(set([n1, n2, n3])))  # 1
登录后复制

要完成解决方案,必须重写 hash 方法一致的哈希和唯一标识:

class Number:

    def __init__(self, number):
        self.number = number

    def __eq__(self, other):
        return isinstance(other, Number) and self.number == other.number

    def __hash__(self):
        return hash(self.number)
登录后复制

这解决了使用 dict 进行相等比较时遇到的哈希问题,确保可靠的集合行为和不同对象的唯一标识。

以上是如何在Python类中实现优雅的相等比较?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责声明 Sitemap
PHP中文网:公益在线PHP培训,帮助PHP学习者快速成长!