Как сделать дипеквал по объекту в питоне
Есть ли функция, чтобы я мог сделать
class Test():
def __init__(self):
self.value_1 = 42
x = Test()
y = Test()
deepequals(x, y) == True
x.value = 7
deepequals(x, y) == False
y.value = 7
deepequals(x, y) == True
Однако по умолчанию это всегда будет false, потому что x и y - это разные экземпляры Test.
2 ответа
Решение
Вы можете реализовать __eq__
(равно) "магический метод":
class Test():
def __init__(self):
self.value_1 = 42
def __eq__(self, other):
return self.__dict__ == other.__dict__
где __dict__
содержит все атрибуты экземпляра Это вернется True
когда два объекта имеют одинаковые значения для всех одинаковых атрибутов. Это дает желаемый результат:
>>> x = Test()
>>> y = Test()
>>> x == y
True
>>> x.value = 7
>>> x == y
False
>>> y.value = 7
>>> x == y
True
class Test:
def __init__(self):
self.value_1 = 42
def __eq__(self, other):
return (
self.__class__ == other.__class__ and
self.value_1 == other.value_1)
t1 = Test()
t2 = Test()
print(t1 == t2)
вывод
True
Вы можете реализовать __eq__
вашего класса. Тогда вы можете использовать стандартный оператор сравнения:
class Test():
def __init__(self):
self.value = 42
def __eq__ (self, other):
return self.value == other.value
x = Test()
y = Test()
print (x == y)
x.value = 7
print (x == y)
y.value = 7
print (x == y)