Импорт модулей внутри класса 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 должен быть помещен в верхнюю часть исходного файла. Я бы придерживался этого правила, кроме особых случаев.