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

2024-09-27 09:35:58 发布

您现在位置:Python中文网/ 问答频道 /正文

如何检查

class FooBar(object):
    __init__(self, param):
        self.param = param
        self.param_2 = self.function_2(param)
        self.param_3 = self.function_3()

是一样的吗?我的意思是它们在所有变量中都有相同的值。

a = FooBar(param)
b = FooBar(param)

我想到了

if a == b:
    print "a and b are identical"!

这样做不会有副作用吗?

我问题的背景是单元测试。我想实现如下目标:

self.failUnlessEqual(self.my_object.a_function(), another_object)

Tags: andselfifobjectparaminitfunction单元测试
3条回答

为了避免在模型中添加或删除属性,并且忘记对__eq__函数进行适当的更改,您可以如下定义它。

def __eq__(self, other):
    if self.__class__ == other.__class__:
        fields = [field.name for field in self._meta.fields]
        for field in fields:
            if not getattr(self, field) == getattr(other, field):
                return False
        return True
    else:
        raise TypeError('Comparing object is not of the same type.')

这样,就比较了所有对象属性。现在可以使用object.__eq__(other)object == other检查属性相等性。

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

如果您只想比较all属性的相等性,那么您可以通过比较每个对象中的__dict__来简洁地执行此操作:

class MyClass:

    def __eq__(self, other) : 
        return self.__dict__ == other.__dict__

对于任意对象,==运算符仅当两个对象是同一个对象(即,如果它们引用内存中的同一地址)时才返回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

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

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

另一点需要注意的是,如果您尝试用我上面的方法将FooBar对象与另一种类型的对象进行比较,python将尝试访问另一种类型的对象的param、param_2和param_3属性,这将抛出AttributeError。您可能希望首先检查要与之比较的对象是一个具有is instance(other,FooBar)的FooBar实例。默认情况下不会这样做,因为在某些情况下,您可能希望返回True以便在不同类型之间进行比较。

请参阅AJ的答案,以获得一种更整洁的方法来简单地比较所有也不应该抛出属性错误的参数。

有关丰富比较的更多信息,请参见the python docs

相关问题 更多 >

    热门问题