Дано, объект А, от него отнаследованы объекты X, Y, Z.
Есть глобальная функция сравнения двух объектов(comp(o1, o2)). Раньше объекты могли быть только типа А, так что проблем не было. Теперь, они могут быть разных типов(А, X, Y, Z). Соответственно выяснилось, что правила сравнения для Х немного отличаются от правил сравнения для остальных объектов.
Какой вариант решения наиболее правильный/аккуратный/меньше проблем впоследствии?
1) Добавить условие в функцию comp(), чтобы для объекта Х идти по другой ветке.
2) Сделать две функции сравнения common_comp() и X_comp(), и, соответственно вызывать одну из них в зависимости от типа объекта и других параметров
3) Добавить функцию сравнения в А, а в Х ее переопределить, тогда будет получаться что-то типо такого:
def comp(o1, o2)
return o1.comp(o1,o2)
Вопрос, как все это сделать аккуратнее и не так криво?