Импорт модулей внутри класса Python - PullRequest
43 голосов
/ 28 июля 2011

В настоящее время я пишу класс, которому нужны os, stat и некоторые другие.

Какой лучший способ импортировать эти модули в моем классе?

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

Теперь я импортирую их в свои методы, но, возможно, есть лучшее решение.

Ответы [ 4 ]

39 голосов
/ 28 июля 2011

Если ваш модуль всегда будет импортировать другой модуль, всегда ставьте его сверху как PEP 8 , а другие ответы указывают. Кроме того, как упоминает @delnan в комментарии, в любом случае используются sys, os и т. Д., Поэтому не повредит импортировать их глобально.

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

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

condition = True

if condition:
    class C(object):
        os = __import__('os')
        def __init__(self):
            print self.os.listdir

    C.os
    c = C()

Если вы хотите, чтобы он был импортирован, только если экземпляр класса , сделайте это в __new__ или __init__.

11 голосов
/ 28 июля 2011

PEP 8 на импорт:

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

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

5 голосов
/ 09 декабря 2015
import sys
from importlib import import_module

class Foo():

    def __init__(self):

        if self.condition:
            self.importedModule = import_module('moduleName')

        if 'moduleName' in sys.modules:
            self.importedModule.callFunction(params)

        #or

        if self.condition:
            self.importedModule.callFunction(params)
0 голосов
/ 28 июля 2011

Эта официальная статья (поиск в разделе "Импорт") гласит, что import s обычно следует помещать в начало вашего исходного файла.Я соблюдаю это правило, кроме особых случаев.

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