函数内省

函数内省

除了__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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章