[英]How to import classes defined in __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
有可能,还是我必须将 class 分离到另一个文件中?
好的,如果我从另一个脚本导入 lib,我可以访问 Helper class。 如何从 settings.py 访问 Helper class?
此处的示例描述了包内引用。 我引用“子模块经常需要相互引用”。 就我而言,lib.settings.py 需要 Helper,而 lib.foo.someobject 需要访问 Helper,那么我应该在哪里定义 Helper class?
' 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
定义了 package 从外部的外观。 如果您需要在settings.py
中使用Helper
,请在不同的文件中定义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
Output:
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 class 然后在 settings.py 你可以使用:
from . import Helper
这是有效的,因为。 是当前目录,从设置模块的角度来看,它是 lib package 的同义词。 请注意,不必通过__all__
导出 Helper。
(通过 python 2.7.10 确认,在 Windows 上运行。)
您只需将它们放在 __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
<class 'test.classes.A'>
>>> test.B
<class 'test.classes.B'>
>>> test.Helper
<class 'test.Helper'>
编辑,因为我误解了这个问题:
只需将Helper
class 放入__init__.py
即可。 那是完美的pythonic。 来自 Java 之类的语言感觉很奇怪。
将类似的内容添加到lib/__init__.py
from.helperclass import Helper
现在您可以直接导入它:
from lib import Helper
对的,这是可能的。 您可能还想在__init__.py
文件中定义__all__
。 这是您执行时将要导入的模块列表
from lib import *
也许这可以工作:
import __init__ as lib
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.