Соглашение Python: конструктор функции для частного класса - PullRequest
9 голосов
/ 21 января 2011

Я заметил это в источнике потокового модуля Python:

def Event(*args, **kwargs):
  return _Event(*args, **kwargs)

class _Event(_Verbose):
  ...

Правильно ли я считаю, что это попытка имитировать «запечатанный» класс (c #) или «финальный» класс (java)на других языках?Это общий шаблон в Python?Есть ли другие подходы к этой проблеме в Python?

Ответы [ 2 ]

5 голосов
/ 21 января 2011

Не думаю, что мне нравится этот выбор идентификаторов. Обычно имена классов начинаются с заглавной буквы, поэтому вы можете подумать, что можете сказать isinstance(x, Event), но не можете. Я думаю, что имя, такое как make_event, которое однозначно идентифицирует функцию как функцию, было бы лучше.

Эта проблема уже обсуждалась в списке рассылки, где BDFL сообщает :

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

Упомянутое им изменение еще не было сделано, но я думаю, что можно с уверенностью сказать, что в настоящее время схема именования считается ошибочной и не должна распространяться.

Вы правы, когда говорите, что эти фабричные функции были введены для имитации запечатанного класса. BDFL говорит

Разрешение их подкласса затрудняет их замену на некоторые платформы с эквивалентными, но более быстрыми реализациями.

Я не думаю, что эта схема слишком распространена. В большинстве случаев нет стимула заменять классы эквивалентными реализациями, и если класс не предназначен для создания подклассов, вы можете упомянуть об этом в документации.

1 голос
/ 21 января 2011

Казалось бы, идея, но, очевидно, все еще вполне возможно наследовать от классов, если вы хотите (даже если они были в отдельном модуле, вы можете сделать type(Event()), чтобы получить ссылку. Возможно, это простонамеревался заставить людей подумать, прежде чем создавать подклассы.

Это не распространенный шаблон в Python. Есть очень немного вещей, которые мы специально не рекомендуем наследовать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...