Как мне создать защищенный конструктор пакетов в Python? - PullRequest
1 голос
/ 10 декабря 2010

Я хотел бы создать шаблон фабрики в Python, где один класс имеет некоторую конфигурацию и знает, как создать объект другого класса (или несколько классов) по требованию. Чтобы сделать это завершенным, я хотел бы предотвратить создание созданного класса за пределами фабрики. В Java я поместил бы оба в один и тот же пакет и сделал бы защищенный пакет конструктора класса.

Для обычных имен методов или переменных можно следовать соглашению Python и использовать одинарные или двойные подчеркивания ("_foo" или "__foo"). Есть ли способ сделать что-то подобное для конструктора?

Спасибо

Ответы [ 4 ]

3 голосов
/ 10 декабря 2010

Вы не можете. Менталитет Python часто описывается как «мы все здесь взрослые»; то есть нельзя останавливать людей, вызывающих методы, меняющих атрибуты, создающих экземпляры классов и так далее. Вместо этого вам следует создать очевидный способ создания экземпляра вашего класса, а затем предположить, что он будет использоваться.

2 голосов
/ 10 декабря 2010

Соглашение в Python - ставить префикс к имени внутренних вещей (члены или классы) с подчеркиванием .Нет никакого способа обеспечить ограниченный доступ, но подчеркивание служит сигналом, что «вы не должны касаться этого».

Из учебника по питону :

«Частные» переменные экземпляра, к которым нельзя получить доступ, кроме как изнутри объекта, не существуют в Python.Однако существует соглашение, которому следует большая часть кода Python: имя с префиксом подчеркивания (например, _spam) следует рассматривать как непубличную часть API (будь то функция, метод или элемент данных),Он должен рассматриваться как деталь реализации и может быть изменен без уведомления.

2 голосов
/ 10 декабря 2010

Не беспокойтесь, это не путь Python.

Предпочтительным решением является простое документирование того, какой метод-конструктор или фабричный метод клиенты должны вызывать, и не слишком беспокоиться о публичном / приватном (что в любом случае не имеет большого значения в Python; все по сути общедоступно в коде). )

1 голос
/ 12 декабря 2010

На основании комментария от Wim можно назвать класс создаваемого объекта, начиная с одинарного или двойного подчеркивания. Таким образом, становится ясно, что конструктор является закрытым и не должен вызываться напрямую.

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