如何导入在__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需要访问帮助器,所以我应该在哪里定义帮助器类?
-
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
你只要把它们放在__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