函數內省
除了__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 |