
Python的類就像命名空間。Python程序默認(rèn)處于全局命名空間內(nèi),類體則處于類命名空間內(nèi),Python 允許在全局范圍內(nèi)放置可執(zhí)行代碼,當(dāng) Python 執(zhí)行該程序時(shí),這些代碼就會(huì)獲得執(zhí)行的機(jī)會(huì)。類似地,Python同樣允許在類范圍內(nèi)放置可執(zhí)行代碼,當(dāng) Python 執(zhí)行該類定義肘,這些代碼同樣會(huì)獲得執(zhí)行的機(jī)會(huì)。
例如,如下程序測(cè)試了類命名空間:
class?Item:
#?直接在類空間中放置執(zhí)行性質(zhì)代碼
print('正在定義Item類')
for?i?in?range(10):
if?i?%?2?==?0?:
print('偶數(shù):',?i)
else:
print('奇數(shù):',?i)
正如從上面代碼所看到的,程序直接在 Item 類體中放置普通的輸出語(yǔ)句、循環(huán)語(yǔ)句、分支語(yǔ)句,這都是合法的。當(dāng)程序執(zhí)行 Item 類時(shí),Item 類命名空間中的這些代碼都會(huì)被執(zhí)行。
從執(zhí)行效果來(lái)看,這些可執(zhí)行代碼被放在 Python 類命名空間與全局空間并沒有太大的區(qū)別。確實(shí)如此,這是因?yàn)槌绦虿]有定義“成員”(變量或函數(shù)),這些代碼執(zhí)行之后就完了,不會(huì)留下什么。
但下面代碼就有區(qū)別。下面代碼示范了在全局空間和類命名空間內(nèi)分別定義 lambda 表達(dá)式:
global_fn?=?lambda?p:?print('執(zhí)行l(wèi)ambda表達(dá)式,p參數(shù):?',?p)
class?Category:
cate_fn?=?lambda?p:?print('執(zhí)行l(wèi)ambda表達(dá)式,p參數(shù):?',?p)
#?調(diào)用全局范圍內(nèi)的global_fn,為參數(shù)p傳入?yún)?shù)值
global_fn('fkit')??#?①
c?=?Category()
#?調(diào)用類命名空間內(nèi)的cate_fn,Python自動(dòng)綁定第一個(gè)參數(shù)
c.cate_fn()??#?②
上面程序分別在全局空間、類命名空間內(nèi)定義了兩個(gè) lambda 表達(dá)式,在全局空間內(nèi)定義的 lambda 表達(dá)式就相當(dāng)于一個(gè)普通函數(shù),因此程序使用調(diào)用函數(shù)的方式來(lái)調(diào)用該 lambda 表達(dá)式,并顯式地為第一個(gè)參數(shù)綁定參數(shù)值,如上面程序中 ① 號(hào)代碼所示。
對(duì)于在類命名空間內(nèi)定義的 lambda 表達(dá)式,則相當(dāng)于在該類命名空間中定義了一個(gè)函數(shù),這個(gè)函數(shù)就變成了實(shí)例方法,因此程序必須使用調(diào)用方法的方式來(lái)調(diào)用該 lambda 表達(dá)式,Python 同樣會(huì)為該方法的第二個(gè)參數(shù)(相當(dāng)于 self 參數(shù))綁定參數(shù)值,如上面程序中 ② 號(hào)代碼所示。