Инициализация модуля Python

Является ли плохой практикой инициализация объектов в модуле, в коде модуля?

in Module.py:

class _Foo(object):
    def __init__(self):
        self.x = 'Foo'

Foo = _Foo()

Чем в пользовательском коде, вы можете:

>>> from Module import Foo
>>> print Foo.x
'Foo'
>>>

... без необходимости инициализировать класс Foo в пользовательском коде. Конечно, это полезно, только если вам не нужны аргументы для инициализации объекта.

Есть ли причина не делать этого?


person tMC    schedule 13.09.2011    source источник
comment
вы можете использовать @staticmethod и переменные класса, если вам нужен только один экземпляр   -  person JBernardo    schedule 13.09.2011
comment
@JBernardo Вы не можете использовать staticmethod и переменные класса, вы можете использовать classmethod и переменные класса. Однако это плохой способ создать синглтон.   -  person agf    schedule 13.09.2011
comment
@agf Я знаю, что это похоже на (плохой) образ жизни Java ... но это не так уж плохо.   -  person JBernardo    schedule 13.09.2011
comment
Вы по-прежнему путаете подклассы, если ссылаетесь на класс по имени из staticmethods вместо использования автоматически переданной ссылки на класс из classmethods.   -  person agf    schedule 13.09.2011


Ответы (2)


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

Сказав это, если у вас есть веские причины (например, вам нужен только один экземпляр класса), то обязательно инициализируйте его во время загрузки.

person Ethan Furman    schedule 13.09.2011

Я делаю это иногда, когда это действительно удобно, но я склонен делать foo = Foo(). Мне очень не нравится идея сделать класс закрытым и сделать экземпляр доступным как Foo. Как разработчик, использующий ваш код, я бы счел это довольно запутанным.

person zeekay    schedule 13.09.2011
comment
Даже если по какой-то причине вы действительно действительно хотите, чтобы класс был закрытым, вы все равно должны использовать строчные буквы для имени экземпляра. - person agf; 13.09.2011
comment
Да, потому что, следуя PEP8, мозги других Python-разработчиков меньше страдают. - person zeekay; 13.09.2011