当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《如何导入__init__.py中定义的类》经验,为你挑选了3个好方法。

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

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

此处的示例描述了包内引用.我引用"子模块经常需要互相引用".在我的例子中,lib.settings.py需要Helper,而lib.foo.someobject需要访问Helper,那么我应该在哪里定义Helper类?



1> jfs..:

    ' 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定义包的外观.如果你需要使用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

输出:

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


赞成“ \ _ \ _ init \ _ \ _。py定义了您的程序包从外部看的外观。”

2> yoyo..:

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

from . import Helper

这是因为.是当前目录,从设置模块的角度来看,它充当lib包的同义词.请注意,没有必要通过导出Helper __all__.

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



3> Aaron Maenpa..:

你只需将它们放在__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

>>> test.B

>>> test.Helper

推荐阅读
Gbom2402851125
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有