You can implement the __eq__ (equals) "magic method":
class Test():
def __init__(self):
self.value_1 = 42
def __eq__(self, other):
return self.__dict__ == other.__dict__
where __dict__ holds all of the instance attributes. This will return True when two objects have all the same values for all the same attributes. This gives the result you want:
>>> x = Test()
>>> y = Test()
>>> x == y
True
>>> x.value = 7
>>> x == y
False
>>> y.value = 7
>>> x == y
True
To support comparisons with objects that do not have a __dict__ attribute (like those defined in C or using __slots__ instead) you can either check for that attribute first using hasattr:
return hasattr(other, '__dict__') and self.__dict__ == other.__dict__
or access it safely using getattr with a default:
return self.__dict__ == getattr(other, '__dict__', None)