我正在尝试组织一些模块供我自己使用。我有这样的事情:
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类示例here描述了包内引用。我引用“子模块经常需要互相引用”。在我的例子中,lib.settings.py需要Helper,而lib.foo.someobject需要访问Helper,那么我应该在哪里定义Helper类?
答案 0 :(得分:67)
'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
中使用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
答案 1 :(得分:11)
如果lib/__init__.py
定义了Helper类,那么在settings.py中您可以使用:
from . import Helper
这是有效的。是当前目录,从设置模块的角度来看,它充当lib包的同义词。请注意,无需通过__all__
导出Helper。
(使用python 2.7.10确认,在Windows上运行。)
答案 2 :(得分:7)
你只需将它们放在__init __。py。
中所以test / classes.py是:
class A(object): pass
class B(object): pass
...并且测试/ __ 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'>
答案 3 :(得分:4)
编辑,因为我误解了这个问题:
将Helper
课程放在__init__.py
中。这完全是pythonic。来自像Java这样的语言感觉很奇怪。
答案 4 :(得分:3)
将此类内容添加到lib/__init__.py
from .helperclass import Helper
现在你可以直接导入它:
from lib import Helper
答案 5 :(得分:1)
是的,有可能。您可能还想在__all__
个文件中定义__init__.py
。这是
from lib import *
答案 6 :(得分:-5)
也许这可行:
import __init__ as lib