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