__init__.py에 정의 된 클래스를 가져 오는 방법

내 자신의 용도로 일부 모듈을 구성하려고합니다. 다음과 같은 것이 있습니다.

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

에서는 lib/__init__.pylib를 가져올 때 사용할 클래스를 정의하고 싶습니다. 그러나 클래스를 파일로 분리하지 않고는 알아낼 수 없으며 __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. 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패키지가 외부에서 어떻게 보이는지 정의합니다. Helperin 을 사용해야 하는 경우 다른 파일 (예 : ‘ ‘) 에서 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