我正在尝试组织一些模块供我自己使用.我有这样的事情:
lib/
__init__.py
settings.py
foo/
__init__.py
someobject.py
bar/
__init__.py
somethingelse.py
Run Code Online (Sandbox Code Playgroud)
在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
Run Code Online (Sandbox Code Playgroud)
我想要这样的东西:
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
Run Code Online (Sandbox Code Playgroud)
是可能的,还是我必须将类分成另一个文件?
好吧,如果我从另一个脚本导入lib,我可以访问Helper类.如何从settings.py访问Helper类?
此处的示例描述了包内引用.我引用"子模块经常需要互相引用".在我的例子中,lib.settings.py需要Helper,而lib.foo.someobject需要访问Helper,那么我应该在哪里定义Helper类?
jfs*_*jfs 72
' lib/的父目录必须是sys.path.
你的' lib/__init__.py'可能看起来像这样:
from . import settings # or just 'import settings' on old Python versions
class Helper(object):
pass
Run Code Online (Sandbox Code Playgroud)然后以下示例应该工作:
from lib.settings import Values
from lib import Helper
Run Code Online (Sandbox Code Playgroud)
__init__.py定义包的外观.如果你需要使用Helperin 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
Run Code Online (Sandbox Code Playgroud)
输出:
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
Run Code Online (Sandbox Code Playgroud)
yoy*_*oyo 15
如果lib/__init__.py定义了Helper类,那么在settings.py中你可以使用:
from . import Helper
Run Code Online (Sandbox Code Playgroud)
这是因为.是当前目录,从设置模块的角度来看,它充当lib包的同义词.请注意,没有必要通过导出Helper __all__.
(在Windows上运行的python 2.7.10确认.)
你只需将它们放在__init__.py中.
所以test/classes.py是:
class A(object): pass
class B(object): pass
Run Code Online (Sandbox Code Playgroud)
...并且test/__ init__.py是:
from classes import *
class Helper(object): pass
Run Code Online (Sandbox Code Playgroud)
您可以导入测试并可以访问A,B和Helper
>>> import test
>>> test.A
<class 'test.classes.A'>
>>> test.B
<class 'test.classes.B'>
>>> test.Helper
<class 'test.Helper'>
Run Code Online (Sandbox Code Playgroud)
将这样的内容添加到 lib/__init__.py
from .helperclass import Helper
现在您可以直接导入它:
from lib import Helper
| 归档时间: |
|
| 查看次数: |
102725 次 |
| 最近记录: |