本文主要介紹python模組載入的過程。所有的module都是由物件和物件之間的關係組成。
python中所有的東西都是物件,分為三類:型別type、類class和例項instance。
三種物件之間的兩種關係:
類和物件的關係可以通過內建方法type
來辨別。
python中,任何乙個類都是直接或間接繼承自object,而每乙個物件都會擁有自己的type型別,可以通過__class__屬性獲得。
python首先需要載入多個基礎的module,例如__builtin__,sys等,同時也會完成python型別系統的初始化和異常系統的初始化。
python內部維護了乙個維護載入到記憶體的module集合,需要現在集合中查詢module是否存在。如果存在直接返回該module物件,否則建立該module物件,並插入到module集合中。建立module後,需要設定module的屬性。
由於python的module集合是乙個pydictobject物件,而pydictobject物件在python中是乙個可變物件,所以其中維護的元素有可能在執行時被刪除。對於python的擴充套件module,例如sys,為了避免再一次初始化同樣的module,python將所有的擴充套件module通過乙個全域性的pydictobject物件來進行備份維護。
python中的run_mode函式基於ast抽象語法樹 (ast, abstract syntax tree)完成了位元組碼的編譯工作,並建立pycodeobject物件。
python中所有的執行緒都是共享同樣的builtin名字空間。
import功能包括:
py檔案中的import不會影響上一層的命名空間,只會影響各自的命名空間,也就是影響各自module自身維護的那個dict物件。但所有的import操作都會影響全域性的module集合,這樣的話只要再一次import該module,python虛擬機器只需要將全域性module集合中快取的物件返回。
在module的基礎之上,python提供了package機制(邏輯相關聯的module需要聚合到同一package中)。也就是說通過package機制來管理module,通過module來管理class。
檔案件中存在__init__.py檔案才能成為package(多個py檔案組成的資料夾)。
在載入package下的module時,例如a.b.c,python內部將這個module視為乙個樹形結構,c是b的子節點,b是a的子節點。python虛擬機器在動態載入時,需要將這個樹形結構分解,然後從左到右依次去sys.modules中查詢每乙個符號是否存在。如果已經存在,假設存在a,那麼在a對應的pymoduleobject物件中保持著__path__路徑資訊,此時就可以在a.__path__路徑中搜尋b和c了。
del刪除模組只是把模組從當前命名空間中刪除,但該module依然存在於module快取中。
python中的全域性module集合sys.modules被稱為modules快取,保證了module的唯一性,每當有import操作都會在該sys.modules查詢,如果不存在就會將該module加入到sys.modules中。
python模組載入
秉著python一切皆為物件的原則,我來看看python庫的型別 import os print type os 結果為乙個名為 module 的型別 1 什麼樣的檔案型別叫做模組 以.py檔案結尾的都可以被python認為是模組 2 package的概念 為了幫助組織模組並提供名稱層次結構,pyt...
python載入模組 Python 模組的載入順序
基本概念 module 模組,乙個 py 檔案或以其他檔案形式存在的可被匯入的就是乙個模組 package 包,包含有 init 檔案的資料夾 relative path 相對路徑,相對於某個目錄的路徑 absolute path 絕對路徑,全路徑 python 直譯器是如何查詢包和模組的 pyth...
python 模組的載入
不管是用import還是用from mmmm import 的方式匯入模組,當程式執行之後,回頭在看那個儲存著mmmm.py檔案的目錄中,多了乙個檔案 ls mmm mmmm.py mmmm.pyc 在這個目錄下面,除了原來的那個mmmm.py之外,又多了乙個mmmm.pyc檔案,這個檔案不是我寫的...