函數內省

函數內省

除了__doc__,函數對象還有很多屬性。使用dir函數可以探知factorial具有下述屬性:

dir(factorial)

['__annotations__',
 '__call__',
 '__class__',
 '__closure__',
 '__code__',
 '__defaults__',
 '__delattr__',
 '__dict__',
 '__dir__',
 '__doc__',
 '__eq__',
 '__format__',
 '__ge__',
 '__get__',
 '__getattribute__',
 '__globals__',
 '__gt__',
 '__hash__',
 '__init__',
 '__init_subclass__',
 '__kwdefaults__',
 '__le__',
 '__lt__',
 '__module__',
 '__name__',
 '__ne__',
 '__new__',
 '__qualname__',
 '__reduce__',
 '__reduce_ex__',
 '__repr__',
 '__setattr__',
 '__sizeof__',
 '__str__',
 '__subclasshook__']

其中大多數屬性是Python對象共有的。本節討論與把函數視作對象相關的幾個屬性,先從__dict__開始。

與用戶定義的常規類一樣,函數使用__dict__屬性存儲賦予它的用戶屬性。這相當於一種基本形式的註解。

下面重點說明函數專有而用戶定義的一般對象沒有的屬性。

計算兩個屬性集合的差集便能得到函數的專有屬性列表。

#列出常規對象沒有而函數有的屬性
>>> class C: pass  # ➊     
>>> obj = C()  # ➋ 
>>> def func(): pass  # ➌ 
>>> sorted(set(dir(func)) - set(dir(obj))) # ➍ 
['__annotations__', '__call__', '__closure__', '__code__', '__defaults__', 
'__get__', '__globals__', '__kwdefaults__', '__name__', '__qualname__'] 
>>>

➊ 創建一個空的用戶定義的類。
➋ 創建一個實例。
➌ 創建一個空函數。
➍ 計算差集,然後排序,得到類的實例沒有而函數有的屬性列表。

用戶定義的函數的屬性

名稱 類型 說明
annotations dict 參數和返回值的註解
call method-wrapper 實現()運算符;即可調用對象協議
closure tuple 函數閉包,即自由變量的綁定(通常是None)
code code 編譯成字節碼的函數元數據和函數定義體
defaults tuple 形式參數的默認值
get method-wrapper 實現只讀描述符協議(參見第20章)
globals dict 函數所在模塊中的全局變量
kwdefaults dict 僅限關鍵字形式參數的默認值
name str 函數名稱
qualname str 函數的限定名稱,如Random.choice
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章