代碼塊的分類
python中分幾種代碼塊類型,它們都有自己的作用域,或者說名稱空間:
文件或模塊整體是一個(gè)代碼塊,名稱空間為全局范圍
函數(shù)代碼塊,名稱空間為函數(shù)自身范圍,是本地作用域,在全局范圍的內(nèi)層
函數(shù)內(nèi)部可嵌套函數(shù),嵌套函數(shù)有更內(nèi)一層的名稱空間類代碼塊,名稱空間為類自身
類中可定義函數(shù),類中的函數(shù)有自己的名稱空間,在類的內(nèi)層 類的實(shí)例對(duì)象有自己的名稱空間,和類的名稱空間獨(dú)立 類可繼承父類,可以鏈接至父類名稱空間正是這一層層隔離又連接的名稱空間將變量、類、對(duì)象、函數(shù)等等都組織起來,使得它們可以擁有某些屬性,可以進(jìn)行屬性查找。
本文詳細(xì)解釋類和對(duì)象涉及的名稱空間,屬于純理論類的內(nèi)容,有助于理解python面向?qū)ο蟮募?xì)節(jié)。期間會(huì)涉及全局和本地變量作用域的查找規(guī)則,如有不明白之處,可先看文章:Python作用域詳述
一個(gè)概括全文的示例
以下是一個(gè)能在一定程度上概括全文的示例代碼段:
x = 11 # 全局變量xdef f(): # 全局變量f print(x) # 引用全局變量xdef g(): # 全局變量g x = 22 # 定義本地變量x print(x) # 引用本地變量xclass supcls(): # 全局變量supcls x = 33 # 類變量x def m(self): # 類變量m,類內(nèi)函數(shù)變量self x = 44 # 類內(nèi)函數(shù)變量x self.x = 55 # 對(duì)象變量xclass cls(supcls): # 全局變量cls x = supcls.x # 引用父類屬性x,并定義cls類屬性x def n(self): # 類變量n self.x = 66 # 對(duì)象變量x
如果能理解上面的每個(gè)x屬于哪個(gè)作用域、哪個(gè)名稱空間,本文內(nèi)容基本上就理解了。
類的名稱空間
下面有一個(gè)類,類中有類屬性x、y,有類方法m和n。
class supcls(): x = 3 y = 4 def m(self): x = 33 self.x = 333 self.y = 444 self.z = 555 def n(self): return self.x, self.y, self.z
當(dāng)python解釋到supcls代碼塊后,知道這是一個(gè)類,類有自己的名稱空間。所以,當(dāng)知道了這個(gè)類里面有x、y、m、n后,這幾個(gè)屬性都會(huì)放進(jìn)類supcls的名稱空間中。
如下圖:

在上圖中,類的名稱空間中有屬性x、y、m和n,它們都稱為類屬性。需要說明的是,在python中,函數(shù)變量m、n和普通變量沒什么區(qū)別,僅僅只是它保存了指向函數(shù)體的地址,函數(shù)體即上圖中用func m和func n所表示的對(duì)象。
因?yàn)橛忻Q空間,可以直接使用完全限定名稱去訪問這個(gè)名稱空間中的內(nèi)容。例如:
print(supcls.x)print(supcls.y)print(supcls.m)print(supcls.n)
輸出結(jié)果:
3
4
<function supcls.m at 0x02B83738>
<function supcls.n at 0x02B836F0>
新聞熱點(diǎn)
疑難解答
圖片精選