__eq__ 方法将两个自定义对象与列表进行比较

Posted

技术标签:

【中文标题】__eq__ 方法将两个自定义对象与列表进行比较【英文标题】:__eq__ method to compare two custom objects with list 【发布时间】:2022-01-05 08:42:05 【问题描述】:

我有一个包含字符串列表的 python 类。我想比较这个类的两个实例。但是,我注意到如果我的班级变大,那么比较写起来会很麻烦。有没有比这更简单的方法来编写__eq__ 方法?我使用 List 而不是 Set,因为我想在稍后阶段用来自 JSON 的数据填充这个类。

json_one = "var_one": "hello", "var_two": ["foo", "bar"]
json_two = "var_one": "hello", "var_two": ["bar", "foo"]

@dataclass
class Test:
    var_one: str
    var_two: List[str]

    def __eq__(self, other):
        if isinstance(other, Test):
            return self.var_one == other.var_one\
                   and sorted(self.var_two) == sorted(other.var_two)
        return False


test_one = Test(**json_one)
test_two = Test(**json_two)

if test_one == test_two:
    print("yay we're equal with lists in different order")

【问题讨论】:

并非如此。如果数据类只是属性的相等比较,则数据类可以生成方法,如果您想要比这更复杂的东西,这取决于您。如果var_two的顺序无关紧要,也许一套更合适? 对不起,我不知道这里到底应该是什么“麻烦”。对我来说看起来非常简单和紧凑。我不明白你想在这里简化什么。没有必要进一步简化。 ---- 你应该改变的只有一件事:显然顺序并不重要,你应该为var_two 使用一组,而不是常规列表。 @RegisMay 很好地描绘了一个有 20 个变量的类。这将是一个很大的 if 语句。 List 的原因是我从 JSON 获取数据,并且在该 JSON 数据中有列表。 重点是不要如果默认结构不符合您的需要,只需将 JSON 扩展为 Python 对象。 定义你的类独立的JSON,并添加一个可以专门解析JSON的(类)方法来创建类的实例。 【参考方案1】:

可以使用json.load 的输出定义您的类的实例这一事实不应决定您的类的设计。而是“自然地”定义您的类,并提供一种使用 JSON 响应创建实例的方法。

from dataclasses import dataclass
import json

@dataclass
class Test:
    # Emphasize the independence of your class from any particular JSON object
    str1: str
    set_of_str1: set[str]

    @classmethod
    def from_json(cls, s):
        d = json.loads(s)
        return cls(d['var_one'], set(d['var_two']))


assert Test("foo", set(["bar", "baz"])) == \
        Test.from_json('"var_one": "foo", "var_two": ["baz", "bar"]')

【讨论】:

以上是关于__eq__ 方法将两个自定义对象与列表进行比较的主要内容,如果未能解决你的问题,请参考以下文章

重载 __eq__ 以返回自定义对象

python类与对象-如何让类支持比较操作

默认情况下 __eq__() 方法里面有啥

Python_类和对象_自定义类与属性

02024_自定义异常的练习

salesforce 零基础学习(六十三)Comparable实现Object列表数据的自定义排序