深入理解并使用python的模块与包
模塊
編寫好的一個(gè)python文件可以有兩種用途:
1)腳本,一個(gè)文件就是整個(gè)程序,用來(lái)被執(zhí)行
2)模塊,文件中存放著一堆功能,用來(lái)被導(dǎo)入使用
模塊的分類
1)開(kāi)發(fā)者編寫的 .py文件
2 ) 由C或C++編譯的共享庫(kù)或DLL
3 ) 包
4 ) 內(nèi)置模塊
模塊的查找順序
1)內(nèi)存中已經(jīng)加載的模塊(防止重復(fù)加載)
2 ) 內(nèi)置模塊(所以說(shuō)自定義模塊不應(yīng)該和系統(tǒng)模塊同名)
3 )sys.path路徑中包含的模塊
額外知識(shí):sys.path初始化順序
1 )執(zhí)行文件所在的當(dāng)前目錄
2 )PTYHONPATH(包含一系列目錄名,與shell變量PATH語(yǔ)法一樣)
3 )依賴安裝時(shí)默認(rèn)指定的
模塊的使用
使用前必知
1)不管程序走到哪個(gè)模塊的哪一步,程序只認(rèn)程序啟動(dòng)的路徑文件夾。
2)重導(dǎo)入只會(huì)增加模塊的引用
具體地說(shuō),第一次導(dǎo)入后就將模塊名加載到內(nèi)存了,后續(xù)的import語(yǔ)句僅是對(duì)已經(jīng)加載到內(nèi)存中的模塊對(duì)象增加了一次引用,不會(huì)重新執(zhí)行模塊內(nèi)的語(yǔ)句
額外功能
1)用于測(cè)試環(huán)境的模塊重導(dǎo)入:import importlib? ? ?importlib.reload(aa)
2 )?為模塊名起別名 import spam as sm ,這種做法常用于統(tǒng)一接口名一樣的模塊
3 )?限制模塊導(dǎo)入的名字
在spam.py中新增一行,__all__=['money','read1'] #這樣在另外一個(gè)文件中用from spam import *就這能導(dǎo)入列表中規(guī)定的兩個(gè)名字
擴(kuò)展知識(shí):提高模塊加載速度的.pyc文件
pyc文件(字節(jié)碼文件)也可以被python解釋器執(zhí)行,其功能主要是提高加載模塊的速度。
注意的是:從.pyc文件中讀指令來(lái)執(zhí)行不會(huì)比從.py文件中讀指令執(zhí)行更快,只有在模塊被加載時(shí),.pyc文件才是更快的
pyc文件怎樣產(chǎn)生?
python解釋器會(huì)在__pycache__目錄中下緩存每個(gè)模塊編譯后的版本,
格式為:module.version.pyc。通常會(huì)包含python的版本號(hào)。例如,在CPython3.3版本下,spam.py模塊會(huì)被緩存成__pycache__/spam.cpython-33.pyc。
這種命名規(guī)范保證了編譯后的結(jié)果多版本共存。Python檢查源文件的修改時(shí)間與編譯的版本進(jìn)行對(duì)比,如果過(guò)期就需要重新編譯。這是完全自動(dòng)的過(guò)程。
由于編譯的模塊是平臺(tái)獨(dú)立的,所以相同的庫(kù)可以在不同的架構(gòu)的系統(tǒng)之間共享。 使得pyc成為一種跨平臺(tái)的字節(jié)碼,是由python虛擬機(jī)來(lái)執(zhí)行的,
但是pyc的內(nèi)容跟python的版本相關(guān),不同的版本編譯后的pyc文件不同,2.5編譯的pyc文件不能到3.5上執(zhí)行,
并且pyc文件是可以反編譯的,因而它的出現(xiàn)僅僅是用來(lái)提升模塊的加載速度的,不是用來(lái)加密的。
注意:python解釋器在以下兩種情況下不檢測(cè)緩存
1) 如果是在命令行中被直接導(dǎo)入模塊,則按照這種方式,每次導(dǎo)入都會(huì)重新編譯,并且不會(huì)存儲(chǔ)編譯后的結(jié)果
2 )? 如果源文件不存在,那么緩存的結(jié)果也不會(huì)被使用,如果想在沒(méi)有源文件的情況下來(lái)使用編譯后的結(jié)果,則編譯后的結(jié)果必須在源目錄下
?
?
包
包就是一個(gè)包含有__init__.py文件的文件夾,所以其實(shí)我們創(chuàng)建包就是為了將模塊組織起來(lái)。創(chuàng)建包的目的是為了被導(dǎo)入使用。
注意: 在python3中,即使包下沒(méi)有__init__.py文件,import 包仍然不會(huì)報(bào)錯(cuò),而在python2中,包下一定要有該文件,否則import 包報(bào)錯(cuò)
包的使用
使用前必知
1)導(dǎo)入包本質(zhì)就是在導(dǎo)入包的包下的__init__.py,?產(chǎn)生的名稱空間的名字同樣來(lái)源于文件
2)單獨(dú)導(dǎo)入包名稱時(shí)不會(huì)導(dǎo)入包中所有包含的所有子模塊。from glance.api import *,實(shí)際上該語(yǔ)句只會(huì)導(dǎo)入包api下__init__.py文件中定義的名字
若想僅僅導(dǎo)入包,就使用包.包.模塊形式,例如:import glance.db.models
或者在__init__.py上面下功夫。
例如:
#glance/__init__.py
from . import cmd
#glance/cmd/__init__.py
from . import manage
3)?from后import導(dǎo)入的模塊,必須是明確的是被導(dǎo)入的右邊不能帶點(diǎn),否則會(huì)有語(yǔ)法錯(cuò)誤,如:from a import b.c是錯(cuò)誤語(yǔ)法
4 )??'.','..'這些相對(duì)路徑符,只能用于連接包內(nèi)的模塊用的,
換句話說(shuō),存在相對(duì)模塊引塊只是為了被另外的模塊引用而存在,永遠(yuǎn)不能當(dāng)做入口。而入口處的路徑必定是絕對(duì)路徑
?
轉(zhuǎn)載于:https://www.cnblogs.com/ziyide/p/9096084.html
總結(jié)
以上是生活随笔為你收集整理的深入理解并使用python的模块与包的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 【Unity】Protobuf的使用与常
- 下一篇: 【Python基础】字符编码ASCII-