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