如何导入在__ 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 类。如何从 setings.py 访问 Helper 类?

示例 给你描述了包内引用。我引用“子模块经常需要相互引用”。在我的示例中,lib.setings.py 需要 Helper,而 lib.foo.some 对象需要访问 Helper,因此我应该在哪里定义 Helper 类?

178316 次浏览

编辑,因为我误解了这个问题:

只要把 Helper类放在 __init__.py中。简直就像蟒蛇一样。只是从 Java 这样的语言中说出来感觉很奇怪。

你只要把它们放在 _ _ init _ _. py 里。

因此,test/classes.py 是:

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

... 和 test/_ _ init _ _. py 是:

from classes import *


class Helper(object): pass

您可以导入 test 并访问 A、 B 和 Helper

>>> import test
>>> test.A
<class 'test.classes.A'>
>>> test.B
<class 'test.classes.B'>
>>> test.Helper
<class 'test.Helper'>

是的,有可能。您可能还希望在 __init__.py文件中定义 __all__。这是一个模块列表,当您这样做时将导入这些模块

from lib import *
  1. lib/的父目录必须在 sys.path中。

  2. 你的“ lib/__init__.py”可能是这样的:

    from . import settings # or just 'import settings' on old Python versions
    class Helper(object):
    pass
    

Then the following example should work:

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

也许这个可以行得通:

import __init__ as lib

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

from .helperclass import Helper

现在你可以直接导入:

from lib import Helper

如果 lib/__init__.py定义了 Helper 类,那么在 setings.py 中可以使用:

from . import Helper

这样做是因为。是工作目录,从设置模块的角度来看,它是 lib 包的同义词。注意,没有必要通过 __all__导出 Helper。

(通过在 Windows 上运行的 python 2.7.10确认)