如何导入__init__.py中定义的类 [英] How to import classes defined in __init__.py

查看:495
本文介绍了如何导入__init__.py中定义的类的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I am trying to organize some modules for my own use. I have something like this:

lib/
  __init__.py
  settings.py
  foo/
    __init__.py
    someobject.py
  bar/
    __init__.py
    somethingelse.py

lib/__init__.py中,我想定义一些在导入lib时要使用的类.但是,如果不将这些类分离到文件中并将其导入到__init__.py中,我似乎无法弄清楚.

In lib/__init__.py, I want to define some classes to be used if I import lib. However, I can't seem to figure it out without separating the classes into files, and import them in__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

是否可以,或者我必须将类分为另一个文件?

Is it possible, or do I have to separate the class into another file?

好的,如果我从另一个脚本导入lib,则可以访问Helper类.如何从settings.py访问Helper类?

OK, if I import lib from another script, I can access the Helper class. How can I access the Helper class from settings.py?

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

The example here describes Intra-Package References. I quote "submodules often need to refer to each other". In my case, the lib.settings.py needs the Helper and lib.foo.someobject need access to Helper, so where should I define the Helper class?

推荐答案

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

  1. 'lib/'s parent directory must be in sys.path.

您的"lib/__init__.py"可能看起来像这样:

Your 'lib/__init__.py' might look like this:

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

Answer to the edited version of the question:

__init__.py defines how your package looks from outside. If you need to use Helper in settings.py then define Helper in a different file e.g., '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中定义的类的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆