有没有办法检查两个对象在python中的每个变量中是否包含相同的值?

Auf*_*ind 19 python object match

如何检查是否有两个实例

class FooBar(object):
    __init__(self, param):
        self.param = param
        self.param_2 = self.function_2(param)
        self.param_3 = self.function_3()
Run Code Online (Sandbox Code Playgroud)

是一样的?相同的意思是他们在所有变量中都有相同的值.

a = FooBar(param)
b = FooBar(param)
Run Code Online (Sandbox Code Playgroud)

我想到了

if a == b:
    print "a and b are identical"!
Run Code Online (Sandbox Code Playgroud)

这会没有副作用吗?

我的问题的背景是单元测试.我希望实现以下目标:

self.failUnlessEqual(self.my_object.a_function(), another_object)
Run Code Online (Sandbox Code Playgroud)

AJ.*_*AJ. 38

如果您希望==工作,那么__eq__在您的类中实现该方法以执行丰富的比较.

如果你想要做的只是比较所有属性的相等性,你可以通过比较__dict__每个对象来简洁地做到这一点:

class MyClass:

    def __eq__(self, other) : 
        return self.__dict__ == other.__dict__
Run Code Online (Sandbox Code Playgroud)

  • 请注意,`__dict__`-比较`__eq__`可能会返回'True`,即使`other`是一个完全不同的类,只要它具有相同的属性.我知道,这是有道理的.插入一个`if self .__ class__!= other .__ class__:如果你想要防范它,首先返回False`. (10认同)

KZi*_*vas 8

对于 python 3.7 及以上版本,您还可以使用它dataclass来轻松检查您想要的内容。例如:

from dataclasses import dataclass

@dataclass
class FooBar:
    param: str
    param2: float
    param3: int

a = Foobar("test_text",2.0,3)
b = Foobar("test_text",2.0,3)

print(a==b)
Run Code Online (Sandbox Code Playgroud)

会回来True


act*_*imp 5

对于任意对象,==如果两个对象是同一个对象(即,如果它们引用内存中的相同地址),则运算符将仅返回 true。

要获得更多“定制”行为,您需要覆盖丰富的比较运算符,在这种情况下特别是__eq__. 尝试将其添加到您的课程中:

def __eq__(self, other):
    if self.param == other.param \
    and self.param_2 == other.param_2 \
    and self.param_3 == other.param_3:
        return True
    else:
        return False
Run Code Online (Sandbox Code Playgroud)

(所有参数的比较可以在这里整理,但为了清楚起见,我将它们留在了里面)。

请注意,如果参数本身就是您定义的对象,则这些对象必须以__eq__类似的方式定义才能使其工作。

另一点要注意的是,如果您尝试按照我上面所做的方式将 FooBar 对象与其他类型的对象进行比较,python 将尝试访问其他类型的对象的 param、param_2 和 param_3 属性,这将抛出一个属性错误。您可能希望首先检查您要比较的对象是 FooBar 的实例,并带有 isinstance(other, FooBar) 。默认情况下不会这样做,因为在某些情况下,您可能希望返回 True 以在不同类型之间进行比较。

请参阅 AJ 的答案,了解更简洁的方法来简单地比较所有不应引发属性错误的参数。

有关丰富比较的更多信息,请参阅python 文档