如何导入在__init__.py中定义的类

我正在尝试组织一些模块供我自己使用。 我有这样的东西:

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需要帮助器和lib.foo.someobject需要访问帮助器,所以我应该在哪里定义帮助器类?

  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.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 

你只要把它们放在__init__.py中。

所以用test / classes.py是:

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

…和testing/ __ init__.py是:

 from classes import * class Helper(object): pass 

您可以导入testing并可以访问A,B和Helper

 >>> 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定义了Helper类,那么在settings.py中可以使用:

 from . import Helper 

这是因为。 是当前目录,从设置模块的angular度看,它作为lib软件包的同义词。 请注意,不需要通过__all__导出助手。

(用Python 2.7.10确认,在Windows上运行。)

对的,这是可能的。 您可能还想在__init__.py文件中定义__all__ 。 这是当你这样做的时候会被导入的模块列表

 from lib import * 

把这样的东西添加到lib/__init__.py

from .helperclass import Helper

现在你可以直接导入它:

from lib import Helper

也许这可以工作:

 import __init__ as lib