2015-06-15 6 views
6

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

Нет никакого интереса к импорту каждого конкретного модуля спереди, а поскольку некоторым модулям требуется специальное оборудование для работы, это может даже вызвать ошибки.

Я хотел бы знать, если это возможно импортировать этот модуль только при необходимости, то есть на конкретизации точного класса, например, так:

class SpecificClassThatNeedRandomModule(object): 
    import randomModule 

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

+3

Я не думаю, что поставить оператор импорта в определении класса задержит его, как вы ожидаете. Тем не менее, вы можете сделать свой импорт в функции, и тогда это произойдет только при первом вызове этой функции. –

+2

Также проверьте [как проверить, был ли импортирован один модуль python?] (Http://stackoverflow.com/questions/5027352/how-to-test-if-one-python-module-has-been-imported). Хорошие вещи существуют на этих постах. – FallenAngel

ответ

4

Можно импортировать модуль в конкретизации:

class SpecificClassThatNeedRandomModule(object): 
    def __init__(self): 
     import randomModule 
     self.random = randomModule.Random() 

Однако это плохая практика, потому что трудно понять, когда импорт выполнен. Вы можете изменить свой модуль так, чтобы он не вызывает исключение, или поймать ImportError:

try: 
    import randomModule 
except ImportError: 
    randomModule = None 
+0

Хотя это * может быть плохой практикой; Я считаю, что ОП пытается только импортировать модули, которые действительно нужны или используются сами по себе. Но +1 на «хорошей практике». –

+0

@PadraicCunningham Вы не могли. Вам нужно будет: '' if randomModule: '' –

3

Вы хотите, чтобы "импорт" в конструкторе класса:

Пример:

class SpecificClassThatNeedRandomModule(object): 

    def __init__(self, *args, **kwargs): 
     import randomModule 

     self.randomModule = randomModule # So other methods can reference the module! 
+1

Вы правы, но вам нужно добавить 'self.randomModule = randomModule', если вы хотите использовать свой модуль в другой функции экземпляра. В любом случае, спасибо за ваш ответ! – CoMartel

Смежные вопросы