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