Comparando dos objetos

¿Hay alguna forma de verificar si dos objetos tienen los mismos valores, aparte de iterar a través de sus atributos y compararlos manualmente?

Las soluciones de @Joe Kington funcionan si hay un __dict__ (algunos objetos, incluidos los construidos, no tienen uno) y __eq__ funciona para todos los valores de ambos dictados (una excepción mal escrita de __eq__ mayraise, etc.). Pero es horriblemente anti-tónica. Ni siquiera maneja los subtipos nominales de manera adecuada … y mucho menos los subtipos estructurales (es decir, los tipos que puede utilizar en su lugar / para tipificación de pato). No hagas esto.

Pero, por lo general, es mejor __eq__ método __eq__ hecho a __eq__ que solo compare algunos atributos que son significativos. Ej. Racional solo debería comparar numerador y denominador, nada más.

Para exponer sobre la respuesta de Delnan:

 _NOTFOUND = object() class Rational(object): def __eq__(self, other): for attr in ['numerator', 'denominator']: v1, v2 = [getattr(obj, attr, _NOTFOUND) for obj in [self, other]] if v1 is _NOTFOUND or v2 is _NOTFOUND: return False elif v1 != v2: return False return True 

Puedes comparar namedtuple directamente.
De lo contrario, debe definir sus propias comparaciones ricas __eq__ y posiblemente __ne__
o tu propio __cmp__

Ver el datamodel para más información.

object1.__dict__ == object2.__dict__ Debería ser todo lo que necesita, creo …

Edit: vars(object1) == vars(object2) es quizás un poco más pirónico, aunque @delnan hace un punto válido sobre los objetos (por ejemplo, int s) que no tienen un __dict__ . No estoy de acuerdo en que un __eq__ personalizado sea un mejor enfoque para casos simples, aunque … A veces no vale la pena esforzarse por ir más allá de lo rápido y lo sucio, si lo rápido y lo sucio hacen lo que necesitas, ¿no?