python模組匯入原理

2021-06-27 12:12:10 字數 1466 閱讀 1595

今日在自學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。

之前提到python的import並不等同與c或者c++的include,因為import並不是把乙個檔案文字直接插入到另外乙個檔案中而已,在編譯時進行;import其實是執行時的運算。

在程式第一次匯入指定檔案時,會執行三個步驟:

注意兩點,1 匯入時不需要加上檔案的路徑 2 匯入時不需要加上檔案的字尾名。

模組搜尋路徑:

*程式主目錄

*pythonpath目錄

*標準鏈結庫目錄

*.pth檔案目錄

前三個估計大家都很了解,第四個是指python執行使用者把有效的路徑新增到模組搜尋路徑中去,也就是在.pth檔案中一行一行的列出來。

如果匯入的檔案並沒有被編譯成位元組碼,python會將起進行解釋,如果已經存在.pyc的檔案,python會檢查位元組碼的時間戳,如果比原始碼的時間戳舊,程式執行時便會從新編譯成為新的位元組碼,否則跳過編譯過程。

程式會講匯入的檔案從頭到尾執行一遍,在此過程中任何對變數名進行的賦值操作,都會產生得到的模組檔案的屬性,但是要注意這些對變數名的賦值操作必須是在模組檔案的頂層進行的操作,例如使用def語句來定義函式,模組檔案中便會新增這個定義的函式屬性。

import使乙個變數名引用整個模組物件,我們可以通過模組名來得到或者使用該模組的屬性;而from語句是將變數名複製到另乙個作用域,我們可以在指令碼重直接使用複製後的變數名。

需要注意的問題是匯入只會發生一次,當第二次匯入時,程式不會執行import工作原理中的三個步驟,而是從python內部模組表中取出已經建立的模組物件。

reload則可以從新匯入模組,實現在不中斷程式的前提下,重新執行import工作原理中所說的三個步驟,匯入模組。reload會在模組當前的命名空間內執行模組檔案的新的**,讓匯入模組檔案重頂層語句執行來對變數名進行從新賦值。reload會影響所有的import語句,而只會對之後使用的from語句有影響,也就是說,對於在reload之前使用from語句複製獲得變數是不受reload影響的。

Python 的模組匯入原理

james bennett 在他的 blog b list 上最近發表了兩篇文章 1,2 談到了 python 中的一些 magic 其中提到所謂的 克拉克第三定律 any sufficiently advanced technology is indistinguishable from magi...

python 匯入模組

最近開始學習python,遇到一些匯入模組的問題,花了幾分鐘終於琢磨明白了,給初學者介紹幾種型別 一 test sys test1 nv1.py nv2.py nv1.py 如下 classdog defadd self a,b self.a a self.b b c self.a self.b r...

python匯入模組

1 模組的定義 模組定義 用來邏輯上組織python 變數 函式 類 邏輯 目的是 實現乙個功能 本質就是.py結尾的python檔案。補充 包的定義 用來從邏輯組織模組的,本質就是乙個目錄 必須帶有乙個 init py檔案 2 匯入方法 匯入模組的方法 1.import module name 匯...