Python中__init__.py文件的作用詳解
__init__.py 文件的作用是將文件夾變?yōu)橐粋€(gè)Python模塊,Python 中的每個(gè)模塊的包中,都有__init__.py 文件。
通常__init__.py 文件為空,但是我們還可以為它增加其他的功能。我們?cè)趯?dǎo)入一個(gè)包時(shí),實(shí)際上是導(dǎo)入了它的__init__.py文件。這樣我們可以在__init__.py文件中批量導(dǎo)入我們所需要的模塊,而不再需要一個(gè)一個(gè)的導(dǎo)入。
# package # __init__.py import re import urllib import sys import os # a.py import package print(package.re, package.urllib, package.sys, package.os)
注意這里訪問(wèn)__init__.py文件中的引用文件,需要加上包名。
__init__.py中還有一個(gè)重要的變量,__all__, 它用來(lái)將模塊全部導(dǎo)入。
# __init__.py __all__ = ['os', 'sys', 're', 'urllib'] # a.py from package import *
這時(shí)就會(huì)把注冊(cè)在__init__.py文件中__all__列表中的模塊和包導(dǎo)入到當(dāng)前文件中來(lái)。
可以了解到,__init__.py主要控制包的導(dǎo)入行為。要想清楚理解__init__.py文件的作用,還需要詳細(xì)了解一下import語(yǔ)句引用機(jī)制:
可以被import語(yǔ)句導(dǎo)入的對(duì)象是以下類型:
•模塊文件(.py文件)
•C或C++擴(kuò)展(已編譯為共享庫(kù)或DLL文件)
•包(包含多個(gè)模塊)
•內(nèi)建模塊(使用C編寫(xiě)并已鏈接到Python解釋器中)
當(dāng)導(dǎo)入模塊時(shí),解釋器按照sys.path列表中的目錄順序來(lái)查找導(dǎo)入文件。
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第一個(gè)元素空字符串代表當(dāng)前目錄。
關(guān)于.pyc 文件 與 .pyo 文件
.py文件的匯編,只有在import語(yǔ)句執(zhí)行時(shí)進(jìn)行,當(dāng).py文件第一次被導(dǎo)入時(shí),它會(huì)被匯編為字節(jié)代碼,并將字節(jié)碼寫(xiě)入同名的.pyc文件中。后來(lái)每次導(dǎo)入操作都會(huì)直接執(zhí)行.pyc 文件(當(dāng).py文件的修改時(shí)間發(fā)生改變,這樣會(huì)生成新的.pyc文件),在解釋器使用-O選項(xiàng)時(shí),將使用同名的.pyo文件,這個(gè)文件去掉了斷言(assert)、斷行號(hào)以及其他調(diào)試信息,體積更小,運(yùn)行更快。(使用-OO選項(xiàng),生成的.pyo文件會(huì)忽略文檔信息)
導(dǎo)入模塊
模塊通常為單獨(dú)的.py文件,可以用import直接引用,可以作為模塊的文件類型有.py、.pyo、.pyc、.pyd、.so、.dll
在導(dǎo)入模塊時(shí),解釋器做以下工作:
1.已導(dǎo)入模塊的名稱創(chuàng)建新的命名空間,通過(guò)該命名空間就可以訪問(wèn)導(dǎo)入模塊的屬性和方法。
2.在新創(chuàng)建的命名空間中執(zhí)行源代碼文件。
3.創(chuàng)建一個(gè)名為源代碼文件的對(duì)象,該對(duì)象引用模塊的名字空間,這樣就可以通過(guò)這個(gè)對(duì)象訪問(wèn)模塊中的函數(shù)及變量
import 語(yǔ)句可以在程序的任何位置使用,你可以在程序中多次導(dǎo)入同一個(gè)模塊,但模塊中的代碼僅僅在該模塊被首次導(dǎo)入時(shí)執(zhí)行。后面的import語(yǔ)句只是簡(jiǎn)單的創(chuàng)建一個(gè)到模塊名字空間的引用而已。
sys.modules字典中保存著所有被導(dǎo)入模塊的模塊名到模塊對(duì)象的映射。
導(dǎo)入包
多個(gè)相關(guān)聯(lián)的模塊組成一個(gè)包,以便于維護(hù)和使用,同時(shí)能有限的避免命名空間的沖突。一般來(lái)說(shuō),包的結(jié)構(gòu)可以是這樣的:
package |- subpackage1 |- __init__.py |- a.py |- subpackage2 |- __init__.py |- b.py
有以下幾種導(dǎo)入方式:
import subpackage1.a # 將模塊subpackage.a導(dǎo)入全局命名空間,例如訪問(wèn)a中屬性時(shí)用subpackage1.a.attr from subpackage1 import a # 將模塊a導(dǎo)入全局命名空間,例如訪問(wèn)a中屬性時(shí)用a.attr_a from subpackage.a import attr_a # 將模塊a的屬性直接導(dǎo)入到命名空間中,例如訪問(wèn)a中屬性時(shí)直接用attr_a 使用from語(yǔ)句可以把模塊直接導(dǎo)入當(dāng)前命名空間,from語(yǔ)句并不引用導(dǎo)入對(duì)象的命名空間,而是將被導(dǎo)入對(duì)象直接引入當(dāng)前命名空間。
以上所述是小編給大家介紹的Python中__init__.py文件的作用詳解,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
相關(guān)文章
Windows系統(tǒng)下使用flup搭建Nginx和Python環(huán)境的方法
這篇文章主要介紹了Windows系統(tǒng)下使用flup搭建Nginx和Python環(huán)境的方法,文中使用到了flup這個(gè)Python的FastCGI工具,需要的朋友可以參考下2015-12-12
Django框架用戶注銷(xiāo)功能實(shí)現(xiàn)方法分析
這篇文章主要介紹了Django框架用戶注銷(xiāo)功能實(shí)現(xiàn)方法,結(jié)合實(shí)例形式分析了基于Django框架的刪除cookie實(shí)現(xiàn)用戶注銷(xiāo)功能的相關(guān)操作技巧,需要的朋友可以參考下2019-05-05
使用Python實(shí)現(xiàn)微信拍一拍功能的思路代碼
這篇文章主要介紹了使用Python實(shí)現(xiàn)微信“拍一拍”的思路代碼,,本文通過(guò)示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-07-07
pandas 時(shí)間偏移的實(shí)現(xiàn)
時(shí)間偏移就是在指定時(shí)間往前推或者往后推一段時(shí)間,即加減一段時(shí)間之后的時(shí)間,本文使用Python實(shí)現(xiàn),感興趣的可以了解一下2021-08-08
Django使用redis緩存服務(wù)器的實(shí)現(xiàn)代碼示例
這篇文章主要介紹了Django使用redis緩存服務(wù)器的實(shí)現(xiàn)代碼示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-04-04
Python OpenCV機(jī)器學(xué)習(xí)之圖像識(shí)別詳解
OpenCV中也提供了一些機(jī)器學(xué)習(xí)的方法,例如DNN等。本文將為大家詳細(xì)介紹一下OpenCV中利用機(jī)器學(xué)習(xí)實(shí)現(xiàn)的一些圖片識(shí)別功能:人臉識(shí)別、車(chē)牌識(shí)別等,感興趣的可以了解一下2022-01-01
python通過(guò)opencv實(shí)現(xiàn)圖片裁剪原理解析
這篇文章主要介紹了python通過(guò)opencv實(shí)現(xiàn)圖片裁剪原理解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-01-01
Python Selenium XPath根據(jù)文本內(nèi)容查找元素的方法
這篇文章主要介紹了Python Selenium XPath根據(jù)文本內(nèi)容查找元素的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12

