Писать опасно
def __eq__(self, other):
return other and self.a == other.a and self.b == other.b
потому что если ваш объект rhs (т.е. other
) оценивается как логическое значение False, он никогда не будет сравниваться как равно чему-либо!
Кроме того, вы можете дважды проверить, принадлежит ли other
классу или подклассу AClass
. Если этого не произойдет, вы получите либо исключение AttributeError
, либо ложное срабатывание (если другой класс имеет атрибуты с тем же именем и совпадающими значениями). Поэтому я бы порекомендовал переписать __eq__
как:
def __eq__(self, other):
return isinstance(other, self.__class__) and self.a == other.a and self.b == other.b
Если по какой-либо причине вам требуется необычайно гибкое сравнение, которое сравнивает несвязанные классы, если атрибуты совпадают по имени, вы все равно хотите по крайней мере избежать AttributeError
и проверить, что other
не имеет никаких дополнительные атрибуты. Как это сделать, зависит от ситуации (поскольку нет стандартного способа найти все атрибуты объекта).