Как импортировать классы, определенные в 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


возможно ли это, или мне нужно разделить класс на другой файл?



EDIT



ОК, если я импортирую lib из другого скрипта, я могу получить доступ к вспомогательному классу. Как я могу получить доступ к вспомогательному классу из settings.py?



пример здесь описывает ссылки внутри пакета. Я цитирую "подмодули часто нужно ссылаться друг на друга". В моем случае, lib.settings.py нужен помощник и Либ.foo.someobject нужен доступ к Helper, так где я должен определить вспомогательный класс?

418   7  

7 ответов:

  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 определяет, как ваш пакет выглядит снаружи. Если вам нужно использовать 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

Если lib/__init__.py определяет вспомогательный класс, то в settings.py вы можете использовать:

from . import Helper

это работает, потому что . является текущим каталогом и выступает в качестве синонима пакета lib с точки зрения модуля настроек. Обратите внимание, что не нужно экспортировать помощника через __all__.

(подтверждено с 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 класс __init__.py. Это идеально подходящие для Python. Это просто кажется странным, исходя из таких языков, как Java.

добавить что-то вроде этого lib/__init__.py

from .helperclass import Helper

Теперь вы можете импортировать его напрямую:

from lib import Helper

Да, это возможно. Вы также можете определить __all__ in __init__.py файлы. Это список модулей, которые будут импортированы, когда вы делаете

from lib import *

может быть, это может сработать:

import __init__ as lib

Comments

    Ничего не найдено.