函数内省
除了__doc__,函数对象还有很多属性。使用dir函数可以探知factorial具有下述属性:
def factorial(n):
return 1 if n < 2 else n * factorial(n - 1)
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__属性存储赋予它的用户属性,这相当于一种基本形式的注解。一般来说,为函数随意赋予属性不是很常见的做法,但是Django框架是这样做的。Django文档中举了下述示例,把short_description属性赋予一个方法,Django管理后台使用这个方法时,会在记录列表中出现指定的描述文本:
def upper_case_name(obj):
return ("%s %s" % (obj.first_name, obj.last_name)).upper()
upper_case_name.short_description = 'Customer name'
# 列出常规对象没有而函数有的属性
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__']