轉自:http://blog.csdn.net/u012422440/article/details/41791433
今日在自學Python,借此機會,正好重新開始寫博文,既可以鞏固python的知識,也可順便提高一下文筆。
一、python模塊基礎
言歸正傳,Python的模塊是python語言中代碼復用的最高級別,也是系統命名空間的的划分標准,也是供頂層文件(就是包含程序主要控制流程的部分)調用的工具庫文件。實現模型其實很簡單,任何一個python文件都可以當做模型通過import進行導入。而python的import與c或者c++的include的原理並不相同,舉個例子就是:
a.py:
- message="test"
- def printer():
- print("test")
b.py:
- import a
- a.printer()
通過import 就是可以讓b.py文件的頂層可以通過變量名b來獲得所有的b.py在頂層定義的所有對象,比如message,printer。
二、import工作原理
之前提到python的import並不等同與c或者c++的include,因為import並不是把一個文件文本直接插入到另外一個文件中而已,在編譯時進行;import其實是運行時的運算。
在程序第一次導入指定文件時,會執行三個步驟:
1.找到模塊文件。
注意兩點,1 導入時不需要加上文件的路徑 2 導入時不需要加上文件的后綴名。
模塊搜索路徑:
*程序主目錄
*PYTHONPATH目錄
*標准鏈接庫目錄
*.pth文件目錄
前三個估計大家都很了解,第四個是指python運行用戶把有效的路徑添加到模塊搜索路徑中去,也就是在.pth文件中一行一行的列出來。
2.編譯成字節碼(如果必要時)。
如果導入的文件並沒有被編譯成字節碼,python會將起進行解釋,如果已經存在.pyc的文件,python會檢查字節碼的時間戳,如果比源碼的時間戳舊,程序運行時便會從新編譯成為新的字節碼,否則跳過編譯過程。
3.執行模塊的代碼來創建其所定義的對象。
程序會講導入的文件從頭到尾執行一遍,在此過程中任何對變量名進行的賦值操作,都會產生得到的模塊文件的屬性,但是要注意這些對變量名的賦值操作必須是在模塊文件的頂層進行的操作,例如使用def語句來定義函數,模塊文件中便會添加這個定義的函數屬性。
三、import,from,reload
import使一個變量名引用整個模塊對象,我們可以通過模塊名來得到或者使用該模塊的屬性;而from語句是將變量名復制到另一個作用域,我們可以在腳本重直接使用復制后的變量名。
需要注意的問題是導入只會發生一次,當第二次導入時,程序不會執行import工作原理中的三個步驟,而是從python內部模塊表中取出已經創建的模塊對象。
reload則可以從新導入模塊,實現在不中斷程序的前提下,重新執行import工作原理中所說的三個步驟,導入模塊。reload會在模塊當前的命名空間內執行模塊文件的新的代碼,讓導入模塊文件重頂層語句執行來對變量名進行從新賦值。reload會影響所有的import語句,而只會對之后使用的from語句有影響,也就是說,對於在reload之前使用from語句復制獲得變量是不受reload影響的。