English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
__init__.py 파일의 역할은 폴더를 Python 모듈로 변환하는 것입니다. Python의 모든 모듈의 패키지에는 __init__.py 파일이 있습니다.
일반적으로 __init__.py 파일은 비어 있지만, 그에 대한 기능을 추가할 수 있습니다. 패키지를 임포트할 때, 실제로는 그 __init__.py 파일을 임포트합니다. 이렇게 하면 __init__.py 파일에서 필요한 모듈을 모두 임포트할 수 있어서, 하나씩 임포트하지 않아도 됩니다.
# package # __init__.py import re import urllib import sys import os # a.py import package print(package.re, package.urllib, package.sys, package.os)
이곳에서 __init__.py 파일에 있는 참조 파일에 접근할 때는 패키지 이름을 추가해야 합니다.
__init__.py에는 중요한 변수가 하나 더 있습니다. __all__는 모듈을 모두 임포트하는 데 사용됩니다.
# __init__.py __all__ = ['os', 'sys', 're', 'urllib'] # a.py from package import *
이 경우 __init__.py 파일에 등록된 __all__ 목록에 있는 모듈과 패키지를 현재 파일에 임포트합니다.
이를 통해 __init__.py가 패키지 임포트 행동을 주로 제어한다는 것을 알 수 있습니다. __init__.py 파일의 역할을 명확히 이해하려면 import 문장 참조 메커니즘을 자세히 이해해야 합니다:
import 문장을 통해 임포트할 수 있는 객체는 다음과 같은 유형입니다:
• 모듈 파일(파일)
• C 또는 C++; 확장(공유 라이브러리나 DLL 파일로 컴파일)
• 패키지(여러 모듈을 포함)
• 내장 모듈(씨어로 작성되어 Python 인터프리터에 링크된 것)
모듈을 임포트할 때, 인터프리터는 sys.path 목록에 있는 디렉토리 순서로 임포트 파일을 찾습니다.
import sys >>> print(sys.path) # 리눅스: ''/usr/local/lib/python3.4', '/usr/local/lib/python3.4/plat-sunos5', '/usr/local/lib/python3.4/lib-tk', '/usr/local/lib/python3.4/lib-dynload', '/usr/local/lib/python3.4/site-packages' # Windows: ['', 'C:\\WINDOWS\\system32\\python34.zip34\\DLLs34\\lib', 'C:\\Python34\\lib\\plat-win', 'C:\\Python34\\lib\\lib-tk', 'C:\\Python34\\Lib\\site-packages\\pythonwin', 'C:\\Python34', 'C:\\Python34\\lib\\site-packages', 'C:\\Python34\\lib\\site-packages\\win32', 'C:\\Python34\\lib\\site-packages\\win32\\lib', 'C:\\Python34\\lib\\site-packages\\wx-2.6-msw-unicode'
list의 첫 번째 요소가 빈 문자열은 현재 디렉토리를 나타냅니다.
.pyc 파일과 .pyo 파일에 대해
.py 파일의汇编은 import 문이 실행될 때만 수행됩니다. .py 파일이 처음으로 입력될 때, 이 파일은 바이트 코드로汇编되고, 바이트 코드는 같은 이름의 .pyc 파일에 기록됩니다. 이후의 모든 입력 작업은 .pyc 파일을 직접 실행합니다(when the modification time of the .py file changes, new .pyc 파일이 생성됩니다), 인터프리터가 사용할 때-O 옵션일 때, 같은 이름의 .pyo 파일을 사용합니다. 이 파일은 주석(assert), 브레이크 포인트 및 다른 디버깅 정보를 제거하여 볼륨이 작고 실행 속도가 빠릅니다. (사용-OO 옵션은 생성된 .pyo 파일이 문서 정보를 무시합니다.
모듈 입력
모듈은 일반적으로 독립적인 .py 파일로, import 문을 사용하여 직접 참조할 수 있으며, 모듈 파일 유형으로는 .py, .pyo, .pyc, .pyd, .so, .dll이 있습니다.
모듈을 입력할 때, 인터프리터는 다음 작업을 수행합니다:
1. 이미 입력된 모듈 이름을 사용하여 새로운 이름 공간을 생성하여, 이 이름 공간을 통해 입력된 모듈의 속성 및 메서드에 접근할 수 있습니다.
2. 새로 생성된 이름 공간에서 소스 코드 파일을 실행합니다.
3. 소스 코드 파일 객체를 생성하여, 이 객체는 모듈 이름 공간을 참조하며, 이를 통해 모듈 내의 함수 및 변수에 접근할 수 있습니다.
import 문은 프로그램의 어느 위치에서든 사용할 수 있으며, 같은 모듈을 프로그램에서 여러 번导入할 수 있지만, 모듈의 코드는 첫 번째로 모듈이导入된 때만 실행됩니다. 그 다음의 import 문은 단순히 모듈 이름 공간에 대한 참조를 생성하는 것에 불과합니다.
sys.modules 딕셔너리는 모든 가져온 모듈의 모듈 이름과 모듈 객체 간의 매핑을 저장하고 있습니다.
패키지 가져오기
관련된 여러 모듈을 하나의 패키지로 구성하여 유지보수와 사용을 용이하게 하고, 이름 공간 충돌을 최소화할 수 있습니다. 일반적으로 패키지 구조는 다음과 같습니다:
package |- subpackage1 |- __init__.py |- a.py |- subpackage2 |- __init__.py |- b.py
다음과 같은 여러 가지 가져오기 방식이 있습니다:
import subpackage1.a # 모듈 subpackage.a를 전역 이름 공간에 가져옵니다. 예를 들어, a 속성에 접근할 때 subpackage를 사용합니다.1.a.attr from subpackage1 import a # 모듈 a를 전역 이름 공간에 가져옵니다. 예를 들어, a 속성에 접근할 때 a.attr_a를 사용합니다. from subpackage.a import attr_a # 모듈 a의 속성을 이름 공간에 직접 가져옵니다. 예를 들어, a 속성에 접근할 때 attr_a를 사용합니다. from 문을 사용하여 모듈을 현재 이름 공간에 직접 가져올 수 있습니다. from 문은 가져온 객체의 이름 공간을 참조하지 않고, 가져온 객체를 현재 이름 공간에 직접 포함합니다.
위에서 소개한 Python의 __init__.py 파일의 역할 설명을 통해 많은 도움이 되었기를 바랍니다. 만약 어떤 의문이 있다면, 댓글을 남겨 주세요. 저는 즉시 답변을 드리겠습니다. 또한, 얼라우 튜토리얼 웹 사이트에 대한 지원에 감사드립니다!
선언: 이 문서의 내용은 인터넷에서 수집되었으며, 저작권자는 모두 소유합니다. 내용은 인터넷 사용자가 자발적으로 기여하고 업로드한 것이며, 이 사이트는 소유권을 가지지 않으며, 인공 편집 처리를 하지 않았으며, 관련 법적 책임도 부담하지 않습니다. 저작권 위반이 의심되는 내용이 있다면, 이메일을 보내 주시기 바랍니다: notice#oldtoolbag.com(메일을 보내면, #을 @으로 바꿔 주세요. 신고를 하고, 관련 증거를 제공하십시오. 실제로 확인되면, 이 사이트는 즉시 위반된 내용을 삭제합니다.)