私は自分の使用のためにいくつかのモジュールを整理しようとしています。私はこのようなものを持っています:
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クラスはどこで定義する必要がありますか?
'lib/
の親ディレクトリはsys.path
になければなりません。
「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.py
でHelper
を使用する必要がある場合は、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
lib/__init__.py
がヘルパークラスを定義する場合、settings.pyで次を使用できます。
from . import Helper
これは動作します。は現在のディレクトリであり、設定モジュールの観点からはlibパッケージの同義語として機能します。 __all__
を介してヘルパーをエクスポートする必要はないことに注意してください。
(python 2.7.10、Windowsで実行中)で確認済み。)
それらを__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'>
編集、質問を誤解したので:
Helper
クラスを__init__.py
に入れるだけです。それは完全にPythonicです。 Javaのような言語から来るのは奇妙に感じます。
このようなものをlib/__init__.py
に追加します
from .helperclass import Helper
これで直接インポートできます:
from lib import Helper
はい、可能です。 __all__
ファイルで__init__.py
を定義することもできます。それはあなたがするときにインポートされるモジュールのリストです
from lib import *