Импорт модулей внутри класса python
В настоящее время я пишу класс, который нуждается в os
, stat
и некоторых других.
Какой лучший способ импортировать эти модули в моем классе?
Я думаю о том, когда другие будут использовать его, я хочу, чтобы модули "dependency" уже импортировались, когда экземпляр класса был создан.
Теперь я импортирую их в свои методы, но, возможно, там лучшее решение.
Ответы
Ответ 1
Если ваш модуль всегда будет импортировать другой модуль, всегда ставьте его наверху как 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__
.
Ответ 2
PEP 8 по импорту:
Импорт всегда помещается в верхнюю часть файла, сразу после комментариев модуля и доклингов, а также перед глобалами и константами модуля.
Это упрощает просмотр всех модулей, используемых в файле, и позволяет избежать повторной копии импорта в нескольких местах, когда модуль используется в нескольких местах. Все остальное (например, function-/импорт уровня метода) должно быть абсолютным исключением и должно быть обоснованным.
Ответ 3
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)
Ответ 4
Это (поиск в разделе "Импорт") утверждает, что import
должен быть помещен в верхнюю часть исходного файла. Я бы придерживался этого правила, кроме особых случаев.