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


105

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

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 클래스를 어디에서 정의해야합니까?


마지막 예가 작동합니다. ImportError가 표시됩니까? 세부 사항을 붙여 넣을 수 있습니까?
Joe Holloway

답변:


81
  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

내 예제의 settings.py 파일에서 Helper 클래스를 어떻게 가져올 수 있습니까?
scottm

나는 그것이 왜 순환인지 이해하지 못한다. settings.py에 Helper가 필요하고 foo.someobject.py에 Helper가 필요하다고 말하면 어디에서 정의 할 것을 제안합니까?
scottm

와, "도우미"라는 단어는이 예에서 의미를 잃어 버리기 시작합니다. 그러나 당신은 내가 찾고있는 것을 보여 주었다.
scottm

3
"__init__.py는 패키지가 외부에서 어떻게 보이는지 정의합니다."에 대해 upvoted.
Petri

19

경우 lib/__init__.py도우미 클래스를 정의하는 것은 다음 settings.py에서 당신은 사용할 수 있습니다 :

from . import Helper

이것은. 현재 디렉토리이며 설정 모듈의 관점에서 lib 패키지의 동의어 역할을합니다. 를 통해 Helper를 내보낼 필요는 없습니다 __all__.

(Windows에서 실행되는 python 2.7.10으로 확인되었습니다.)


1
이것은 저에게 잘 작동합니다. 반대 투표자들은 당신의 불만을 설명해주세요.
yoyo

8

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

어디에서 가져 오기를하고 있습니까?
Aaron Maenpaa

lib / settings.py에서 Helper를 가져오고 싶다고 말합니까?
scottm

1
거의 확실하게 순환 가져 오기가 발생합니다 (설정은 테스트를 가져오고 테스트는 설정을 가져옵니다) ... 이는 설명하는 NameError를 생성합니다. 패키지 내에서 사용되는 도우미를 원하면 코드에서 사용하는 내부 모듈을 정의해야합니다.
Aaron Maenpaa

1
init .py의 도우미는 외부 사용자가 API를 단순화하기위한 것이어야합니다.
Aaron Maenpaa

1
API의 일부 가 아니라면 init .py가 실제로 적합하지 않습니다. lib / internal.py 또는 이와 유사한 것이 훨씬 더 좋을 것입니다 (순환 가져 오기 가능성을 줄이는 두 가지 목적이 있음).
Aaron Maenpaa

5

이것과 같은 것을 추가하십시오 lib/__init__.py

from .helperclass import Helper

이제 직접 가져올 수 있습니다.

from lib import Helper


4

내가 질문을 오해했기 때문에 편집하십시오.

그냥 넣어 Helper에서 클래스를 __init__.py. 완벽하게 비단뱀입니다. Java와 같은 언어에서 나오는 것이 이상하게 느껴집니다.


당신은 오해했습니다. 가능한 경우 helperClass.py 파일을 제거하고 싶습니다.
scottm

리차드 만 오해 한 것은 아닙니다. 귀하의 예가 작동해야합니다. 역 추적이란 무엇입니까?
Troy J. Farrell

글쎄, 나는 문서를 올바르게 읽었습니다. 그래서 이제 막 테스트 케이스를 만들었고 잘 작동합니다.
scottm

패키지에 동일한 설정이 있지만 ImportError "cannot import name Helper"가 나타납니다.
scottm

내 문제는 settings.py에서 Helper 클래스를 가져 오려고한다는 것입니다. 어떻게 할 수 있습니까?
scottm

2

예, 가능합니다. 또한 정의 할 수 있습니다 __all____init__.py파일을 저장합니다. 가져올 때 가져올 모듈 목록입니다.

from lib import *

-6

아마도 이것은 작동 할 수 있습니다.

import __init__ as lib
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.