如何检查
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)
为了避免在模型中添加或删除属性,并且忘记对
__eq__
函数进行适当的更改,您可以如下定义它。这样,就比较了所有对象属性。现在可以使用
object.__eq__(other)
或object == other
检查属性相等性。如果希望
==
工作,那么在类中实现__eq__
方法以执行丰富的比较。如果您只想比较all属性的相等性,那么您可以通过比较每个对象中的
__dict__
来简洁地执行此操作:对于任意对象,
==
运算符仅当两个对象是同一个对象(即,如果它们引用内存中的同一地址)时才返回true。为了获得更多的“定制”行为,您需要重写富比较运算符,在本例中特别是
__eq__
。尝试将此添加到您的类中:(所有参数的比较可以在这里整理一下,但为了清楚起见,我把它们留了下来)。
请注意,如果参数本身就是您定义的对象,则这些对象必须以类似的方式定义
__eq__
才能工作。另一点需要注意的是,如果您尝试用我上面的方法将FooBar对象与另一种类型的对象进行比较,python将尝试访问另一种类型的对象的param、param_2和param_3属性,这将抛出AttributeError。您可能希望首先检查要与之比较的对象是一个具有is instance(other,FooBar)的FooBar实例。默认情况下不会这样做,因为在某些情况下,您可能希望返回True以便在不同类型之间进行比较。
请参阅AJ的答案,以获得一种更整洁的方法来简单地比较所有也不应该抛出属性错误的参数。
有关丰富比较的更多信息,请参见the python docs。
相关问题 更多 >
编程相关推荐