__init__.py 文件的作用是將文件夾變?yōu)橐粋€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文件)
•包(包含多個模塊)
•內(nèi)建模塊(使用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']
其中l(wèi)ist第一個元素空字符串代表當前目錄。
關(guān)于.pyc 文件 與 .pyo 文件
.py文件的匯編,只有在import語句執(zhí)行時進行,當.py文件第一次被導入時,它會被匯編為字節(jié)代碼,并將字節(jié)碼寫入同名的.pyc文件中。后來每次導入操作都會直接執(zhí)行.pyc 文件(當.py文件的修改時間發(fā)生改變,這樣會生成新的.pyc文件),在解釋器使用-O選項時,將使用同名的.pyo文件,這個文件去掉了斷言(assert)、斷行號以及其他調(diào)試信息,體積更小,運行更快。(使用-OO選項,生成的.pyo文件會忽略文檔信息)
導入模塊
模塊通常為單獨的.py文件,可以用import直接引用,可以作為模塊的文件類型有.py、.pyo、.pyc、.pyd、.so、.dll
在導入模塊時,解釋器做以下工作:
1.已導入模塊的名稱創(chuàng)建新的命名空間,通過該命名空間就可以訪問導入模塊的屬性和方法。
2.在新創(chuàng)建的命名空間中執(zhí)行源代碼文件。
3.創(chuàng)建一個名為源代碼文件的對象,該對象引用模塊的名字空間,這樣就可以通過這個對象訪問模塊中的函數(shù)及變量
import 語句可以在程序的任何位置使用,你可以在程序中多次導入同一個模塊,但模塊中的代碼僅僅在該模塊被首次導入時執(zhí)行。后面的import語句只是簡單的創(chuàng)建一個到模塊名字空間的引用而已。
sys.modules字典中保存著所有被導入模塊的模塊名到模塊對象的映射。
導入包
多個相關(guān)聯(lián)的模塊組成一個包,以便于維護和使用,同時能有限的避免命名空間的沖突。一般來說,包的結(jié)構(gòu)可以是這樣的:
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文件的作用詳解,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對武林網(wǎng)網(wǎng)站的支持!
|
新聞熱點
疑難解答
圖片精選