class utilities have more durable assumptions

__str__ and __repr__ don't throw errors when an expected attribute is
missing.  __eq__ fails if any attribute is missing, even if it's
missing from both objects.