Python__init__.py의 역할

4961 단어 Pythoninit .py
우리는python의 모듈 디렉터리에서 "__init__.py"라는 파일을 자주 볼 수 있습니다. 그러면 도대체 어떤 작용을 합니까?
1. 이 디렉터리가python의 모듈 패키지임을 표시(module package)
만약 당신이python의 관련 IDE를 사용하여 개발을 진행한다면, 디렉터리에 이 파일이 존재한다면, 이 디렉터리는module 패키지로 인식됩니다.
2. 모듈 가져오기 작업 간소화
우리의 모듈 패키지의 디렉터리 구조는 다음과 같다고 가정합니다.

.
└── mypackage
  ├── subpackage_1
  │  ├── test11.py
  │  └── test12.py
  ├── subpackage_2
  │  ├── test21.py
  │  └── test22.py
  └── subpackage_3
    ├── test31.py
    └── test32.py
만약 우리가 가장 직접적인 가져오기 방식을 사용한다면, 전체 파일을 프로젝트 디렉터리에 복사한 다음 직접 가져오십시오.

from mypackage.subpackage_1 import test11
from mypackage.subpackage_1 import test12
from mypackage.subpackage_2 import test21
from mypackage.subpackage_2 import test22
from mypackage.subpackage_3 import test31
from mypackage.subpackage_3 import test32
물론 이 예에는 파일이 적고 모듈이 크며 디렉터리가 깊으면 어떻게 가져와야 할지 기억이 안 날 수도 있습니다.(모듈 하나만 가져오려면 디렉터리에서 오래 찾아야 할 가능성이 높다)
이 경우 __init__.py가 효과가 있어요.우리 먼저 이 서류가 어떻게 작동하는지 봅시다.
2.1 __init__.py는 어떻게 일합니까?
실제로 디렉토리에 __ 이 포함되어 있는 경우init__.py에서 import로 디렉토리를 가져오면 __init__.py 안의 코드.
mypackage 디렉토리에 __ 추가init__.py 파일로 실험하기:

.
└── mypackage
  ├── __init__.py
  ├── subpackage_1
  │  ├── test11.py
  │  └── test12.py
  ├── subpackage_2
  │  ├── test21.py
  │  └── test22.py
  └── subpackage_3
    ├── test31.py
    └── test32.py
mypackage/__init__.py에 print를 추가하면 파일이 출력됩니다.

print("You have imported mypackage")
다음은 직접 상호작용 모드로 import를 진행합니다.

>>> import mypackage
You have imported mypackage
분명히,__init__.py는 패키지를 가져올 때 실행됩니다.
2.2 제어 모듈 가져오기
우리 실험 하나 더 하자, mypackage/_init__.py 다음 문장을 추가합니다.

from subpackage_1 import test11
mypackage를 가져와 보겠습니다.

>>> import mypackage
Traceback (most recent call last):
 File "<stdin>", line 1, in <module>
 File "/home/taopeng/Workspace/Test/mypackage/__init__.py", line 2, in <module>
  from subpackage_1 import test11
ImportError: No module named 'subpackage_1'
잘못 보고했어요...어떻게 된 거야?
원래, 우리가 import를 실행할 때, 현재 디렉터리는 변하지 않습니다. (하위 디렉터리를 실행하는 파일이라도) 완전한 패키지 이름이 필요합니다.

from mypackage.subpackage_1 import test11
종합하면, 우리는 __init__.py 기본적으로 가져올 모듈을 지정합니다
2.3 게으름 피우는 가져오기 방법
때때로 우리는 가져오기를 할 때 게으름을 피우며 가방의 모든 내용을 가져온다

from mypackage import *
이게 어떻게 이루어진 거지? __all__ 변수는 바로 이 일을 하는 것이다.
__all__ 모듈 목록을 연결했습니다. from xx import*를 실행할 때 목록의 모듈을 가져옵니다.우리는__init__.py를 (으)로 수정합니다.

__all__ = ['subpackage_1', 'subpackage_2']
여기에 subpackage가 포함되어 있지 않습니다_3, __를 증명하기 위해all__ 모든 하위 디렉터리를 가져오는 것이 아니라 작용합니다.

>>> from mypackage import *
>>> dir()
['__builtins__', '__doc__', '__loader__', '__name__', '__package__', '__spec__', 'subpackage_1', 'subpackage_2']
>>> 
>>> dir(subpackage_1)
['__doc__', '__loader__', '__name__', '__package__', '__path__', '__spec__']
하위 디렉터리의 모듈을 가져오지 않았습니다!!!
이 예에서 가져오는 것은

from mypackage import subpackage_1, subpackage_2
따라서 가져오기 작업은subpackage_를 계속 찾습니다1 및 subpackage_2에서 __init__.py 및 실행.(단, import*는 실행되지 않습니다.)
저희는 subpackage에서_1 추가 __init__.py 파일:

__all__ = ['test11', 'test12']

#  test11
from mypackage.subpackage_1 import test11
다시 가져오세요.

>>> from mypackage import *
>>> dir()
['__builtins__', '__doc__', '__loader__', '__name__', '__package__', '__spec__', 'subpackage_1', 'subpackage_2']
>>> 
>>> dir(subpackage_1)
['__all__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__path__', '__spec__', 'test11']
하위 패키지의 모든 모듈을 가져오려면 더 정확하게 지정해야 합니다.

>>> from mypackage.subpackage_1 import *
>>> dir()
['__builtins__', '__doc__', '__loader__', '__name__', '__package__', '__spec__', 'test11', 'test12']
3. 구성 모듈의 초기화 작업
알고 있습니다__init__.py의 작업 원리를 이해하면 이 파일이 정상적인 python 코드 파일이라는 것을 이해할 수 있을 것이다.
따라서 이 파일에 초기화 코드를 넣을 수 있습니다.
Python__에 대한 간단한 이야기init__.py의 역할에 대한 기사는 여기까지입니다.init__.py 내용은 저희 이전의 글을 검색하거나 아래의 관련 글을 계속 훑어보시기 바랍니다. 앞으로 많은 응원 부탁드립니다!

좋은 웹페이지 즐겨찾기