ему быть наследником?
Если он ломает интерфейс
Инит - часть конструктора, на него не распространяется принцип подстановки Лисков
Значит инит нельзя юзать и в обычных методах, получается
Это уже ошибка того кто написал код, но вообще
А как тогда сделать наследование у Immutable?
Если я например зачем-то реализую свой инт, а потом частный случай этого инта с другим конструктором
У меня есть метод verify_description, проверяющий корректность некого description (свойство моего объекта X). И эта проверка нужна как при создании новой сущности X (через фабрику), так и при изменении описания (через метод самого объекта X). В результате выходит, что я вынужден делать этот метод публичным, чтобы его можно было использовать в фабрике, хотя по идее он публичным не является. Наиболее логичным кажется создание classmethod'а create_new(cls, description, ...), который бы отчасти выполнял роль той фабрики, и при этом имел доступ к protected методам класса X. Но так как он бы использовал внутри себя конструктор cls, такой вариант не подходит. Получается, нужно либо делать проверку в самом конструкторе, либо вынести логику проверки из класса X? Делать проверку в самом конструкторе - логичный вариант, отсечь некорректные состояния на уровне самой инициализации, а не фабрики. Но так сделать не получится, так как он вызывается уже после создания соответствующей сущности в бд в фабрике, и требует айди объекта, для которого тоже нужно уже иметь эту сущность в бд. А перед созданием сущности в бд нужно проверить описание... Вынести логику проверки из класса X - но это же просто 0 < len(description) <= max_description_size, да и по-моему эта сущность должна быть именно классметодом, так как в теории потомки могли бы захотеть поменять это поведение. В результате я исчерпал все варианты и хз что делать. Применить последний вариант, только сделать в X классметод def _verify_description(cls, description): return verify_description(description) который будет использовать в себе вынесенную логику? Единственная идея, в которой пока что не видно проблем. В общем, правильный ли это вариант, и если нет, то как сделать лучше?
Обсуждают сегодня