Python類命名空間

前面章節中,已經不只一次提到,所有位於 class 語句中的代碼,其實都位於特殊的命名空間中,通常稱之爲類命名空間。Python 中,編寫的整個程序默認處於全局命名空間內,而類體則處於類命名空間內。

Python 允許在全局範圍內放置可執行代碼,當 Python 執行該程序時,這些代碼就會獲得執行的機會。類似地,Python 同樣允許在類範圍內放置可執行代碼,當 Python 執行該類定義肘,這些代碼同樣會獲得執行的機會。

例如,如下程序測試了類命名空間:

class Item:
    # 直接在類空間中放置執行性質代碼
    print('正在定義Item類')
    for i in range(10):
        if i % 2 == 0 :
            print('偶數:', i)
        else:
            print('奇數:', i)

運行結果爲:

正在定義Item類
偶數: 0
奇數: 1
偶數: 2
奇數: 3
偶數: 4
奇數: 5
偶數: 6
奇數: 7
偶數: 8
奇數: 9

正如從上面代碼所看到的,程序直接在 Item 類體中放置普通的輸出語句、循環語句、分支語句,這都是合法的。當程序執行 Item 類時,Item 類命名空間中的這些代碼都會被執行。

從執行效果來看,這些可執行代碼被放在 Python 類命名空間與全局空間並沒有太大的區別。確實如此,這是因爲程序並沒有定義“成員”(變量或函數),這些代碼執行之後就完了,不會留下什麼。

但下面代碼就有區別。下面代碼示範了在全局空間和類命名空間內分別定義 lambda 表達式:

global_fn = lambda p: print('執行lambda表達式,p參數: ', p)


class Category:
    cate_fn = lambda p: print('執行lambda表達式,p參數: ', p)


# 調用全局範圍內的global_fn,爲參數p傳入參數值
global_fn('fkit')  # ①
c = Category()
# 調用類命名空間內的cate_fn,Python自動綁定第一個參數
c.cate_fn()  # ②

上面程序分別在全局空間、類命名空間內定義了兩個 lambda 表達式,在全局空間內定義的 lambda 表達式就相當於一個普通函數,因此程序使用調用函數的方式來調用該 lambda 表達式,並顯式地爲第一個參數綁定參數值,如上面程序中 ① 號代碼所示。

對於在類命名空間內定義的 lambda 表達式,則相當於在該類命名空間中定義了一個函數,這個函數就變成了實例方法,因此程序必須使用調用方法的方式來調用該 lambda 表達式,Python 同樣會爲該方法的第一個參數(相當於 self 參數)綁定參數值,如上面程序中 ② 號代碼所示。

發佈了73 篇原創文章 · 獲贊 10 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章