我正在尝试组织一些模块供我自己使用.我有这样的事情:
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
是可能的,还是我必须将类分成另一个文件?
好吧,如果我从另一个脚本导入lib,我可以访问Helper类.如何从settings.py访问Helper类?
此处的示例描述了包内引用.我引用"子模块经常需要互相引用".在我的例子中,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
定义包的外观.如果你需要使用Helper
in settings.py
然后Helper
在另一个文件中定义,例如' lib/helper.py
'.
. | `-- import_submodule.py `-- lib |-- __init__.py |-- foo | |-- __init__.py | `-- someobject.py |-- helper.py `-- settings.py 2 directories, 6 files
命令:
$ 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
定义了Helper类,那么在settings.py中你可以使用:
from . import Helper
这是因为.是当前目录,从设置模块的角度来看,它充当lib包的同义词.请注意,没有必要通过导出Helper __all__
.
(在Windows上运行的python 2.7.10确认.)
你只需将它们放在__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和Helper
>>> import test >>> test.A>>> test.B >>> test.Helper