python模块:命名空间与重载模块
文章目錄
- 模塊命名空間:
- 重載模塊:
模塊命名空間:
0.作用域和命名空間:
作用域針對變量而言,是變量名被賦值的位置,決定變量名能被訪問到的范圍。
命名空間:變量名建立所在的場所。
注意模塊不是模塊對象,模塊的變量名也不是模塊對象的屬性,但是你導入模塊之后,就都是了,也就是說作用域還是命名空間他們是沒有具體的分別的。
模塊對象的屬性在模塊文件的作用域里面建立,所以我們說,模塊對象的作用域也是命名空間。
1.模塊是一個獨立的作用域,導入后,模塊文件的作用域就變成了模塊對象屬性的命名空間。簡而言之,模塊就是命名空間,存在于模塊之內的變量名就是模塊對象的屬性。
2.模塊對象:模塊可以被理解成變量名的封裝,導入一個模塊文件之后,python會建立模塊對象,包含模塊文件內所賦值的所有變量名。
3.模塊文件變為模塊對象的過程:模塊語句在首次導入時執行,python建立空的模塊對象,然后按照文件從頭到尾順序依次執行該模塊文件內部語句。文件頂層賦值變量的語句,會建立模塊對象的屬性,賦值的變量名會存儲在模塊的命名空間里。
4.由導入而建立的模塊的命名空間是通過辭典對象進行存儲的,命名空間只是普通的字典對象,可以通過dir(M)獲取,它還包含了類繼承的變量名。我們在模塊文件中賦值的變量名,在內部成為字典的鍵。字典中多數變量名都反映了文件中頂層的賦值語句,python也會在模塊命名空間里加一些變量名,_file_指明模塊從哪個文件加載,_name_指明導入者名稱。
5.在模塊中,模塊范圍會在模塊加載后變成模塊對象的屬性辭典,函數的本地變量名只在函數執行時存在,但是模塊的本地作用域和全局作用域相同。因此我們說:導入后,模塊文件的作用域就變成了模塊對象的屬性的命名空間。
6.我來總結一下:導入一個模塊,建立一個空的模塊對象,然后執行模塊中語句,如果有賦值變量的語句,那么就建立模塊對象的屬性,這個被賦值的變量名會被存到字典(命名空間)里,模塊加載完之后,這個模塊的作用域就是模塊對象屬性的命名空間,我們可以通過模塊名和變量名(鍵/模塊對象)獲取命名空間里的屬性(值)。
7.看中文也看不太明白,估計是翻譯的鍋,里面好多地方自相矛盾,我現在也沒完全理解。到時候買個英文看看再過來修改吧。
1.點號運算符:object.attribute利用點號運算符獲取任意對象object的attribute屬性。點號運算是表達式,返回和對象相匹配的屬性名的值。用點號運算符讀取變量名時(屬性),已經把對象給明確了。
如果只有一個簡單變量,那么在當前作用域內找變量名x(遵循LEGB,無點號運算的純變量名)
X.Y:當前范圍內搜索X,然后搜索對象X中的屬性Y。
X.Y.Z:尋找對象X中的變量Y,然后再找對象X.Y中的Z
點運算可用于任何具有屬性的對象,比如模塊,類
2.導入和作用域:
不導入文件,就無法存取該文件內定義的變量名。
在例子里,第二個模塊modb定義了全局變量x,導入第一個模塊,調用了第一個模塊的函數。第一個模塊的函數修改moda模塊里的全局變量x,而不是modb中的x
我們可以看出,導入操作不會賦予被導入文件中(moda)代碼對上層代碼(modb)的可見度。函數無法看見其他函數內的變量名,除非它處于這個函數內。模塊代碼無法看見其他模塊內的變量名,除非你把它導入到這個其他模塊里。
3.命名空間的嵌套:
導入不會使命名空間發生向上的嵌套,但是會發生向下的嵌套。有可能深入到任意嵌套的模塊中并讀取其屬性。
這里我們的例子:mod1導入mod2時,創建一個兩層命名空間的嵌套,利用mod2.mod3.X就可以深入到mod3。也就是說,mod1可以訪問三個文件的全局范圍。
但是反過來則不可以,mod3無法看見mod2和mod1的變量名
import語句:將整個模塊對象賦值給一個變量名
在mod1中,mod2只是一個 變量名,引用帶有屬性的對象,而該對象某些屬性可能又引用其他帶有屬性的對象。我們可以說,mod1 import mod2 然后mod2.mod3.X
我們不能說import mod2.mod3。因為這個語句涉及包導入,包導入也會形成模塊命名空間嵌套。其導入語句會反映目錄樹結構,而不是簡單的導入鏈。
重載模塊:
模塊程序代碼默認只對每個過程執行一次,強制使模塊代碼重新載入并運行,需要調用reload,在python3中,reload為于模塊中,使用前需要導入。
只會在第一次導入模塊時,加載和運行該模塊的代碼,之后的導入只會使用已經加載的模塊對象,而不會重載或重新執行文件的代碼。
reload會強制將已經加載的模塊代碼重新載入并重新執行,模塊新代碼的賦值語句會修改現有的模塊對象。
利用reload可以立即看到對組件修改的效果。一般用法就像例子里的,導入一個模塊,然后修改其代碼,然后將其重載。調用reload時,python重新讀取模塊的源代碼,然后執行頂層語句。reload會重新在當前命名空間內執行模塊文件的新代碼并且覆蓋其現有的命名空間,而不會刪除然后重建模塊對象。
重載之后,模塊對象的某些變量的值變成了新的值,因此會影響所有使用import讀取了模塊對象的客戶端。
之前使用from讀取屬性的客戶端不會受到影響,但是之后使用from的會受到影響。
重載的好處:
使程序提供高度動態的接口,用戶可以在系統運作時編寫python程序,而不用獲取整個源代碼,然后編譯整個產品。而且對于那些啟動時需要連接服務器的程序來說,利用重載就好太多了,因為我們雖然改動代碼,但不用再重新啟動。python真的動態,我喜歡!
總結
以上是生活随笔為你收集整理的python模块:命名空间与重载模块的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java applet程序设计,Java
- 下一篇: python基本语句