函数内省

函数内省

除了__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__']
上一篇:Java基础面试题——IO流


下一篇:迷宫问题(递归)