繁体   English   中英

如何导入在 __init__.py 中定义的类

[英]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?

  1. ' lib/的父目录必须在sys.path中。

  2. 您的“ 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM