Как сделать дипеквал по объекту в питоне

Есть ли функция, чтобы я мог сделать

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)
Другие вопросы по тегам