1. ホーム
  2. python

[解決済み] __init__.py で定義されたクラスをインポートする方法

2022-08-17 20:54:30

質問

私は自分自身の使用のためにいくつかのモジュールを整理しようとしています。私はこのようなものを持っています。

lib/
  __init__.py
  settings.py
  foo/
    __init__.py
    someobject.py
  bar/
    __init__.py
    somethingelse.py

lib/__init__.py で、libをインポートする際に使用するクラスを定義したいと思います。しかし、私はクラスをファイルに分離することなしにそれを理解することができないようです。 __init__.py .

と言うよりも

    lib/
      __init__.py
      settings.py
      helperclass.py
      foo/
        __init__.py
        someobject.py
      bar/
        __init__.py
        somethingelse.py

from lib.settings import Values
from lib.helperclass import Helper

こんな感じでお願いします。

    lib/
      __init__.py  #Helper defined in this file
      settings.py
      foo/
        __init__.py
        someobject.py
      bar/
        __init__.py
        somethingelse.py

from lib.settings import Values
from lib import Helper

可能でしょうか、それともクラスを別のファイルに分けなければならないのでしょうか?

EDIT

OK、他のスクリプトからlibをインポートすると、Helperクラスにアクセスできます。どうすればsettings.pyからHelperクラスにアクセスできるのでしょうか?

例として はこちら は、パッケージ内参照について説明しています。私は "サブモジュールはしばしばお互いを参照する必要がある" を引用しています。私の場合、 lib.settings.py は Helper を必要とし、 lib.foo.someobject は Helper にアクセスする必要があります。

どのように解決するのですか?

  1. ' lib/ の親ディレクトリは、必ず sys.path .

  2. あなたの' lib/__init__.py はこのようになります。

    from . import settings # or just 'import settings' on old Python versions
    class Helper(object):
          pass
    
    

そうすると、以下の例のようになるはずです。

from lib.settings import Values
from lib import Helper

編集後の回答

__init__.py は、あなたのパッケージが外からどのように見えるかを定義します。もし Helper の中で settings.py を定義すると Helper を別のファイルで定義します。例えば、' lib/helper.py '.

.
|-- import_submodule.py
    `-- lib
    |-- __init__.py
    |-- foo
    |-- __init__.py
    |-- someobject.py
    |-- helper.py
    `-- settings.py

2つのディレクトリ、6つのファイル

コマンドです。

$ python import_submodule.py

出力します。

settings
helper
Helper in lib.settings
someobject
Helper in lib.foo.someobject

# ./import_submodule.py
import fnmatch, os
from lib.settings import Values
from lib import Helper

print
for root, dirs, files in os.walk('.'):
    for f in fnmatch.filter(files, '*.py'):
        print "# %s/%s" % (os.path.basename(root), f)
        print open(os.path.join(root, f)).read()
        print


# lib/helper.py
print 'helper'
class Helper(object):
    def __init__(self, module_name):
        print "Helper in", module_name


# lib/settings.py
print "settings"
import helper

class Values(object):
    pass

helper.Helper(__name__)


# lib/__init__.py
#from __future__ import absolute_import
import settings, foo.someobject, helper

Helper = helper.Helper


# foo/someobject.py
print "someobject"
from .. import helper

helper.Helper(__name__)


# foo/__init__.py
import someobject