Python中__init__.py檔案的作用詳解,
__init__.py 檔案的作用是將檔案夾變為一個Python模組,Python 中的每個模組的包中,都有__init__.py 檔案。
通常__init__.py 檔案為空白,但是我們還可以為它增加其他的功能。我們在匯入一個包時,實際上是匯入了它的__init__.py檔案。這樣我們可以在__init__.py檔案中大量匯入我們所需要的模組,而不再需要一個一個的匯入。
# package# __init__.pyimport reimport urllibimport sysimport os# a.pyimport package print(package.re, package.urllib, package.sys, package.os)
注意這裡訪問__init__.py檔案中的引用檔案,需要加上包名。
__init__.py中還有一個重要的變數,__all__, 它用來將模組全部匯入。
# __init__.py__all__ = ['os', 'sys', 're', 'urllib']# a.pyfrom package import *
這時就會把註冊在__init__.py檔案中__all__列表中的模組和包匯入到當前檔案中來。
可以瞭解到,__init__.py主要控制包的匯入行為。要想清楚理解__init__.py檔案的作用,還需要詳細瞭解一下import語句引用機制:
可以被import語句匯入的對象是以下類型:
•模組檔案(.py檔案)
•C或C++擴充(已編譯為共用庫或DLL檔案)
•包(包含多個模組)
•內建模組(使用C編寫並已連結到Python解譯器中)
當匯入模組時,解譯器按照sys.path列表中的目錄順序來尋找匯入檔案。
import sys>>> print(sys.path)# Linux:['', '/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.zip', 'C:\\Documents and Settings\\weizhong', 'C:\\Python34\\DLLs', 'C:\\Python34\\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第一個元素Null 字元串代表目前的目錄。
關於.pyc 檔案 與 .pyo 檔案
.py檔案的彙編,只有在import語句執行時進行,當.py檔案第一次被匯入時,它會被彙編為位元組代碼,並將位元組碼寫入同名的.pyc檔案中。後來每次匯入操作都會直接執行.pyc 檔案(當.py檔案的修改時間發生改變,這樣會產生新的.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中屬性時用subpackage1.a.attrfrom subpackage1 import a # 將模組a匯入全域命名空間,例如訪問a中屬性時用a.attr_afrom subpackage.a import attr_a # 將模組a的屬性直接匯入到命名空間中,例如訪問a中屬性時直接用attr_a 使用from語句可以把模組直接匯入當前命名空間,from語句並不引用匯入對象的命名空間,而是將被匯入對象直接引入當前命名空間。
以上所述是小編給大家介紹的Python中__init__.py檔案的作用詳解,希望對大家有所協助,如果大家有任何疑問請給我留言,小編會及時回複大家的。在此也非常感謝大家對幫客之家網站的支援!