문제

django의 모델 시스템이 어떻게 작동하는지 살펴보던 중, 제가 이해하지 못하는 점을 발견했습니다.

나는 당신이 빈 공간을 만든다는 것을 알고 있습니다. __init__.py 파일을 사용하여 현재 디렉터리가 패키지임을 지정합니다.그리고 다음에서 몇 가지 변수를 설정할 수 있습니다. __init__.py import *가 제대로 작동하도록 말이죠.

하지만 django는 ...에서 여러 가지를 추가합니다.수입 ...명령문을 작성하고 여러 클래스를 정의합니다. __init__.py.왜?이것만 보면 상황이 지저분해 보이지 않나요?이 코드가 필요한 이유가 있습니까? __init__.py?

도움이 되었습니까?

해결책

모든 수입품은 __init__.py 포함된 패키지(디렉토리)를 가져올 때 사용할 수 있습니다.

예:

./dir/__init__.py:

import something

./test.py:

import dir
# can now use dir.something

편집하다:언급하는 것을 잊어버렸습니다. __init__.py 해당 디렉터리에서 모듈을 처음 가져올 때 실행됩니다.따라서 일반적으로 패키지 수준 초기화 코드를 배치하기에 좋은 장소입니다.

편집2:dgrant는 내 예에서 발생할 수 있는 혼란을 지적했습니다.~ 안에 __init__.py import something 패키지에서 필요하지 않은 모든 모듈을 가져올 수 있습니다.예를 들어 다음과 같이 바꿀 수 있습니다. import datetime, 그런 다음 최상위 수준에서 test.py 이 두 조각 모두 작동합니다.

import dir
print dir.datetime.datetime.now()

그리고

import dir.some_module_in_dir
print dir.datetime.datetime.now()

결론은 다음과 같습니다.에 할당된 모든 이름 __init__.py, 가져온 모듈, 함수 또는 클래스는 패키지 또는 패키지의 모듈을 가져올 때마다 패키지 네임스페이스에서 자동으로 사용할 수 있습니다.

다른 팁

그것은 실제로 개인적인 취향이며 Python 모듈의 레이아웃과 관련이 있습니다.

다음과 같은 모듈이 있다고 가정해 보겠습니다. erikutils.모듈이 될 수 있는 방법에는 두 가지가 있습니다. erikutils.py 너의 sys.path 또는 다음과 같은 디렉터리가 있습니다. 에리쿠틸스 너의 sys.path 비어있는 __init__.py 그 안에 파일이 있습니다.그런 다음 다음과 같은 모듈이 있다고 가정해 보겠습니다. fileutils, procutils, parseutils 그리고 당신은 그것들이 아래의 하위 모듈이되기를 원합니다 erikutils.따라서 다음과 같은 .py 파일을 만듭니다. fileutils.py, procutils.py, 그리고 파싱틸스.py:

erikutils
  __init__.py
  fileutils.py
  procutils.py
  parseutils.py

아마도 당신은 fileutils, procutils, 또는 parseutils 모듈.그리고 당신이 다음과 같은 새로운 모듈을 만들고 싶지 않다고 가정해 봅시다. miscutils.그리고 다음과 같이 함수를 호출할 수 있기를 원합니다.

erikutils.foo()
erikutils.bar()

하는 것보다

erikutils.miscutils.foo()
erikutils.miscutils.bar()

그래서 왜냐하면 erikutils 모듈은 파일이 아닌 디렉토리이므로 모듈 내부에서 기능을 정의해야 합니다. __init__.py 파일.

django에서 제가 생각할 수 있는 가장 좋은 예는 다음과 같습니다. django.db.models.fields.모든 django *Field 클래스는 __init__.py 파일을 장고/db/모델/필드 예배 규칙서.나는 그들이 모든 것을 가설에 집어넣고 싶지 않았기 때문에 이렇게 한 것 같아요. 장고/db/models/fields.py 모델을 몇 개의 하위 모듈(관련.py, files.py, 예를 들어) 만들어진 *Field 정의를 필드 모듈 자체에 고정했습니다(따라서 __init__.py).

사용하여 __init__.py 파일을 사용하면 내부 패키지 구조를 외부에서 보이지 않게 만들 수 있습니다.내부 구조가 변경되는 경우(예:하나의 fat 모듈을 두 개로 나누었기 때문에) 조정만 하면 됩니다. __init__.py 파일이지만 패키지에 의존하는 코드는 아닙니다.패키지의 일부를 보이지 않게 만들 수도 있습니다.일반적인 용도로 사용할 준비가 되지 않은 경우.

다음을 사용할 수 있습니다. del 명령은 일반적으로 __init__.py 다음과 같이 보일 수 있습니다:

from somemodule import some_function1, some_function2, SomeObject

del somemodule

이제 헤어지기로 결정했다면 somemodule 새로운 __init__.py 아마도:

from somemodule1 import some_function1, some_function2
from somemodule2 import SomeObject

del somemodule1
del somemodule2

외부에서 보면 패키지는 이전과 동일하게 보입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top