web-dev-qa-db-ja.com

pythonクラス内のモジュールのインポート

私は現在、osstat、および他のいくつかを必要とするクラスを書いています。

クラスにこれらのモジュールをインポートする最良の方法は何ですか?

私は他の人がいつそれを使用するかを考えています、クラスがインスタンス化されるときに「依存関係」モジュールがすでにインポートされていることを望みます。

今、私は自分のメソッドにそれらをインポートしていますが、より良い解決策があるかもしれません。

46
Paul

モジュールが常に別のモジュールをインポートする場合は、常に PEP 8 として先頭に配置し、他の回答が示します。また、@ delnanがコメントで言及しているように、sysosなどはとにかく使用されているので、それらをグローバルにインポートしても害はありません。

ただし、特定のランタイム条件でのみモジュールが本当に必要な場合、条件付きインポートには何も問題はありません。

クラスが条件付きブロックまたは別のクラスまたはメソッドにある場合など、クラスがdefinedである場合にのみインポートする場合は、何かを行うことができますこのような:

condition = True

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

    C.os
    c = C()

クラスがinstantiatedの場合にのみインポートする場合は、__new__または__init__

39
agf

PEP 8 インポート時:

インポートは常にファイルの先頭、モジュールのコメントとドキュメント文字列の直後、モジュールのグローバルと定数の前に置かれます。

これにより、手元のファイルで使用されているすべてのモジュールを簡単に確認でき、モジュールが複数の場所で使用されている場合にインポートを複数の場所で複製する必要がなくなります。他のすべて(例:関数/メソッドレベルのインポート)は絶対的な例外である必要があり、適切に正当化する必要があります。

11
user395760
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)
5
nvd

This (「インポート」セクションを検索)公式の論文では、通常importsはソースファイルの先頭に配置する必要があります。特別な場合を除き、この規則を遵守します。

0
Constantinius