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

时间:2009-02-24 17:35:56

标签: python packages

我正在尝试组织一些模块供我自己使用。我有这样的事情:

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

7 个答案:

答案 0 :(得分:67)

  1. 'lib/的父目录必须位于sys.path

  2. 您的“lib/__init__.py”可能如下所示:

    from . import settings # or just 'import settings' on old Python versions
    class Helper(object):
          pass
    
  3. 然后以下示例应该有效:

    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