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