函数内省
除了__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 |