Python名稱空間

用一個(gè)全家桶一樣的例子開啟討論!

class superC:
    X = 3

X = 1
def nester():
    X = 2
    print(X)
    class C(superC):
        X = 3
        print(X)
        def method1(self):
            print(X)
        def method2(self):
            X = 4
            print(X)
    return C()

print(X)

I = nester()
I.method1()
I.method2()
print(I.X, end=' ')
>> 1 2 3 2 4 3

下面來逐個(gè)分析一下都办。


在逐個(gè)分析之前嫡锌,對(duì)python的名稱解析做一下說明。python的名稱解析有兩套邏輯琳钉,一套用于變量(函數(shù)的變量势木、模塊中的全局變量),一套用于對(duì)象屬性歌懒。出現(xiàn)在表達(dá)式中的未知名稱會(huì)被視作變量啦桌,obj.attr語法中的attr被視作屬性。

兩套邏輯都沿著層層嵌套的名稱空間順藤摸瓜及皂,只是藤不一樣甫男。變量解析沿著“LEGB”順序,即Local, Enclosing, Global, Built-in验烧。屬性解析沿著先實(shí)例再繼承樹的順序板驳,繼承樹按層序遍歷,同層按定義父類時(shí)括號(hào)中從左到右的順序噪窘。

兩套邏輯在代碼層面相互交織笋庄,比如obj.attr屬性解析attr之前一定得先解析變量obj,但在邏輯層面不會(huì)混淆倔监。

再說一下python的四種名稱空間直砂,包、模塊浩习、函數(shù)静暂、類。

  • 包在文件系統(tǒng)中是一個(gè)或多個(gè)列在sys.path下的同名文件夾谱秽,其屬性取自文件夾中的__init__.py文件的Global變量洽蛀。
  • 模塊在文件系統(tǒng)中是一個(gè)文件,被其他模塊import時(shí)疟赊,其Global變量變成模塊的屬性郊供。
  • 函數(shù)有一個(gè)臨時(shí)的本地變量空間,函數(shù)調(diào)用結(jié)束后這個(gè)空間就消失了近哟。但在函數(shù)嵌套時(shí)驮审,被內(nèi)層函數(shù)引用的外層函數(shù)的變量不會(huì)消失。
  • 類的本地變量成為類對(duì)象的屬性。但嵌套的類不會(huì)在外層類的本地空間中查找變量疯淫,而是遵守一般的LEGB規(guī)則地来。事實(shí)上,變量解析始終遵守LEGB熙掺,嵌套的類名稱空間根本不起作用未斑。

回到對(duì)開頭的例子,逐個(gè)分析:

  • 先輸出X1是因?yàn)楹瘮?shù)nester的函數(shù)體不在定義時(shí)執(zhí)行币绩,而在調(diào)用時(shí)執(zhí)行蜡秽,本例中調(diào)用語句在X1輸出語句的后面。
  • X2是nester的本地變量类浪,遮蓋了全局的X1载城。
  • 比較微妙的是X3,是類C的本地變量费就,能被同空間中的print引用,但不被method1引用川队。
  • method1引用的是nesterX力细。
    有意思的是,method1的調(diào)用是通過I的屬性解析實(shí)現(xiàn)的固额,而這件事發(fā)生在nester的調(diào)用結(jié)束后眠蚂,nester的本地變量空間已經(jīng)銷毀了。但由于在編譯method1時(shí)發(fā)現(xiàn)它引用了外層的X斗躏,這個(gè)被引用的變量就得到了特殊對(duì)待逝慧,沒有和nester的空間一并銷毀。
  • X4是method2的本地變量啄糙,LEGB的頭一個(gè)笛臣。
  • I.X是本例中唯一的屬性解析。X不在I的本地空間中隧饼,我們從未給I賦此屬性沈堡。XC的本地空間中(C的本地空間在定義后變?yōu)?code>C類對(duì)象的屬性)。沿著實(shí)例燕雁、繼承樹順序诞丽,I.X最終在C類的屬性空間中找到X

元類拐格、裝飾器……超出本文范圍僧免。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市捏浊,隨后出現(xiàn)的幾起案子懂衩,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,284評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件勃痴,死亡現(xiàn)場(chǎng)離奇詭異谒所,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)沛申,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,115評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門劣领,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人铁材,你說我怎么就攤上這事尖淘。” “怎么了著觉?”我有些...
    開封第一講書人閱讀 164,614評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵村生,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我饼丘,道長(zhǎng)趁桃,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,671評(píng)論 1 293
  • 正文 為了忘掉前任肄鸽,我火速辦了婚禮卫病,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘典徘。我一直安慰自己蟀苛,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,699評(píng)論 6 392
  • 文/花漫 我一把揭開白布逮诲。 她就那樣靜靜地躺著帜平,像睡著了一般。 火紅的嫁衣襯著肌膚如雪梅鹦。 梳的紋絲不亂的頭發(fā)上裆甩,一...
    開封第一講書人閱讀 51,562評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音帘瞭,去河邊找鬼淑掌。 笑死,一個(gè)胖子當(dāng)著我的面吹牛蝶念,可吹牛的內(nèi)容都是我干的抛腕。 我是一名探鬼主播,決...
    沈念sama閱讀 40,309評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼媒殉,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼担敌!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起廷蓉,我...
    開封第一講書人閱讀 39,223評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤全封,失蹤者是張志新(化名)和其女友劉穎马昙,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體刹悴,經(jīng)...
    沈念sama閱讀 45,668評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡行楞,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,859評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了土匀。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片子房。...
    茶點(diǎn)故事閱讀 39,981評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖就轧,靈堂內(nèi)的尸體忽然破棺而出证杭,到底是詐尸還是另有隱情,我是刑警寧澤妒御,帶...
    沈念sama閱讀 35,705評(píng)論 5 347
  • 正文 年R本政府宣布解愤,位于F島的核電站,受9級(jí)特大地震影響乎莉,放射性物質(zhì)發(fā)生泄漏送讲。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,310評(píng)論 3 330
  • 文/蒙蒙 一惋啃、第九天 我趴在偏房一處隱蔽的房頂上張望李茫。 院中可真熱鬧,春花似錦肥橙、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,904評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至味榛,卻和暖如春椭坚,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背搏色。 一陣腳步聲響...
    開封第一講書人閱讀 33,023評(píng)論 1 270
  • 我被黑心中介騙來泰國(guó)打工善茎, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人频轿。 一個(gè)月前我還...
    沈念sama閱讀 48,146評(píng)論 3 370
  • 正文 我出身青樓垂涯,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親航邢。 傳聞我的和親對(duì)象是個(gè)殘疾皇子耕赘,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,933評(píng)論 2 355