내 자신의 용도로 일부 모듈을 구성하려고합니다. 다음과 같은 것이 있습니다.
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 클래스를 어디에서 정의해야합니까?
답변
-
‘
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
in 을 사용해야 하는 경우 다른 파일 (예 : ‘ ‘) 에서 settings.py
정의 Helper
하십시오 lib/helper.py
.
. | `-import_submodule.py `-lib |-__init__.py |-foo | |-__init__.py | `-someobject.py |-helper.py `-settings.py 2 개의 디렉토리, 6 개의 파일
명령 :
$ 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 패키지의 동의어 역할을합니다. 를 통해 Helper를 내보낼 필요는 없습니다 __all__
.
(Windows에서 실행되는 python 2.7.10으로 확인되었습니다.)
답변
__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'>
답변
이것과 같은 것을 추가하십시오 lib/__init__.py
from .helperclass import Helper
이제 직접 가져올 수 있습니다.
from lib import Helper
답변
내가 질문을 오해했기 때문에 편집하십시오.
그냥 넣어 Helper
에서 클래스를 __init__.py
. 완벽하게 비단뱀입니다. Java와 같은 언어에서 나오는 것이 이상하게 느껴집니다.
답변
예, 가능합니다. 또한 정의 할 수 있습니다 __all__
에 __init__.py
파일을 저장합니다. 가져올 때 가져올 모듈 목록입니다.
from lib import *
답변
아마도 이것은 작동 할 수 있습니다.
import __init__ as lib