web-dev-qa-db-ja.com

__init__.pyで定義されたクラスをインポートする方法

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

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

lib/__init__.py、libをインポートする場合に使用するいくつかのクラスを定義します。ただし、クラスをファイルに分割し、in__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

それは可能ですか、またはクラスを別のファイルに分ける必要がありますか?

編集

別のスクリプトからlibをインポートすると、ヘルパークラスにアクセスできます。 settings.pyからヘルパークラスにアクセスするにはどうすればよいですか?

here は、パッケージ内参照について説明しています。 「サブモジュールはしばしば相互に参照する必要がある」と引用しています。私の場合、lib.settings.pyにはHelperが必要で、lib.foo.someobjectにはHelperへのアクセスが必要ですが、Helperクラスはどこで定義する必要がありますか?

90
scottm
  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は、パッケージが外部からどのように見えるかを定義します。 settings.pyHelperを使用する必要がある場合は、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
68
jfs

lib/__init__.pyがヘルパークラスを定義する場合、settings.pyで次を使用できます。

from . import Helper

これは動作します。は現在のディレクトリであり、設定モジュールの観点からはlibパッケージの同義語として機能します。 __all__を介してヘルパーをエクスポートする必要はないことに注意してください。

(python 2.7.10、Windowsで実行中)で確認済み。)

12
yoyo

それらを__init__.pyに入れるだけです。

Test/classes.pyの場合:

class A(object): pass
class B(object): pass

...およびtest/__ init__.py

from classes import *

class Helper(object): pass

テストをインポートして、A、B、ヘルパーにアクセスできます

>>> import test
>>> test.A
<class 'test.classes.A'>
>>> test.B
<class 'test.classes.B'>
>>> test.Helper
<class 'test.Helper'>
7
Aaron Maenpaa

編集、質問を誤解したので:

Helperクラスを__init__.pyに入れるだけです。それは完全にPythonicです。 Javaのような言語から来るのは奇妙に感じます。

4

このようなものをlib/__init__.pyに追加します

from .helperclass import Helper

これで直接インポートできます:

from lib import Helper

3

はい、可能です。 __all__ファイルで__init__.pyを定義することもできます。それはあなたがするときにインポートされるモジュールのリストです

from lib import *
1
vartec