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