Python的動態載入機制

2021-08-28 09:32:33 字數 919 閱讀 3012

1、python所有的模組載入到記憶體後,都會放在sys.modules中。

當我們在乙個檔案中import乙個模組的時候,python會先去sys.modules中查詢是否已經載入過這個模組,如果是,則將這個模組的名字加入到正在呼叫import的local命名空間中;如果沒有載入過這個模組,則從sys.path中按照模組名去查詢,找到後載入到記憶體,並加入到sys.modules中。(所以如果要讓python能找到自己寫的一些模組,有時需要在sys.path中加入自己模組的路徑)

2、乙個模組不會被重複載入。當模組a已經在sys.modules中,其他地方要使用模組a的話,需要import a,但是底層機制並不會重複import,但是需要import a是因為要把已經在sys.modules中的模組載入到local命名空間中。

# a.py

from b import d

class c:

pass

# b.py

from a import c

class d:

pass

當執行a時,from b import d會報錯,因為執行這句的時候,python內部先去sys.modules中找module b,如果發現沒有,就會自己建立乙個module b,此時module b中__dict__沒有內容;接著會去執行b.py中的表示式,去新增module b中__dict__中的內容。執行b.py的時候,會去找module a,同樣因為sys.modules中沒有module a,所以就會自己建立乙個新的module a,此時的module a的__dict__也是空的,這時又會去執行a.py中的語句,然後發現sys.modules中已經有module b了,就會在module b中去import d,但是module b中__dict__還是空的,python內部又不知道去**建立乙個新的module d,就報錯了。

Python模組的動態載入機制

python在執行環境初始化中,就將sys module載入到了記憶體中,實際上,python是將一大批的module載入到了記憶體中。但是為了使local名字空間能夠達到最乾淨的效果,python並沒有將這些符號暴露在當前的local名字空間中,而是需要使用者顯式的通過import機制通知pyth...

ExtJs中動態載入機制研究

以service registry portlet為例 比如,在 liferay portlet.xml中定義了 然後在第5314行,就通過另外乙個方法getprefix 來根據controller的類名來獲取它的字首,並且這個字首會最終參與到運算。我們這裡省去這段邏輯,反正最終,這個 servic...

python類載入機制 python的變數快取機制

變數的快取機制 變數的快取機制 以下內容僅對python3.6.x版本負責 機制只要有兩個值相同,就只開闢乙個空間 為什麼要有這樣的機制 在計算機的硬體當中,記憶體是最重要的配置之一,直接關係到程式的執行速度和流暢度。在過去計算機記憶體資源昂貴而小的年代中,程式的記憶體管理成為程式設計中的重要技術之...