Не думаю, что мне нравится этот выбор идентификаторов. Обычно имена классов начинаются с заглавной буквы, поэтому вы можете подумать, что можете сказать isinstance(x, Event)
, но не можете. Я думаю, что имя, такое как make_event
, которое однозначно идентифицирует функцию как функцию, было бы лучше.
Эта проблема уже обсуждалась в списке рассылки, где BDFL сообщает :
Это началось как эксперимент в API
дизайн, где я пытался сделать вещи похожими на аналогичные
Java API, насколько это возможно (я не хотел изобретать еще один шаткий
рулевое колесо). Я специально хотел, чтобы эти не были классами, чтобы люди
не начать подклассы их. В то время PEP-8 не был хорошо
установил (если вообще) и хотел чтобы заводские функции смотрели
как классы. Я думаю, что в 2.7 / 3.1 мы можем изменить заводские функции
соответствовать PEP-8 (оставив старые имена на пару
релиз).
Упомянутое им изменение еще не было сделано, но я думаю, что можно с уверенностью сказать, что в настоящее время схема именования считается ошибочной и не должна распространяться.
Вы правы, когда говорите, что эти фабричные функции были введены для имитации запечатанного класса. BDFL говорит
Разрешение их подкласса затрудняет их замену на некоторые
платформы с эквивалентными, но более быстрыми реализациями.
Я не думаю, что эта схема слишком распространена. В большинстве случаев нет стимула заменять классы эквивалентными реализациями, и если класс не предназначен для создания подклассов, вы можете упомянуть об этом в документации.