source

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

factcode 2023. 8. 2. 09:26
반응형

__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를 가져오면 도우미 클래스에 액세스할 수 있습니다.settings.py 에서 도우미 클래스에 액세스하려면 어떻게 해야 합니까?

여기의 예에서는 패키지 내 참조에 대해 설명합니다.저는 "서브모듈들은 종종 서로를 참조할 필요가 있다"고 인용합니다.저 같은 경우에는 lib.settings.py 에는 Helper와 lib.foo가 필요합니다. 일부 개체는 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패키지가 외부에서 어떻게 보이는지 정의합니다.사용해야 하는 경우Helpersettings.py그런 다음 정의합니다.Helper다른 파일에서, 예를 들어, 'lib/helper.py'.

.'-- import_compodule.pylib__init_.py|-- __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그러면 설정에서 도우미 클래스를 정의합니다.사용할 수 있는 파이:

from . import Helper

이는 .가 현재 디렉터리이고 설정 모듈의 관점에서 lib 패키지의 동의어로 작동하기 때문입니다.다음을 통해 도우미를 내보낼 필요는 없습니다.__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 및 도우미에 액세스할 수 있습니다.

>>> 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그것은 완벽하게 부정적입니다.자바와 같은 언어에서 오는 것은 이상한 느낌입니다.

네, 가능합니다.정의할 수도 있습니다.__all____init__.py파일입니다. 파일을 가져올 때 가져올 모듈 목록입니다.

from lib import *

효과가 있을 수도 있습니다.

import __init__ as lib

언급URL : https://stackoverflow.com/questions/582723/how-to-import-classes-defined-in-init-py

반응형