函数内省

函数内省

除了__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']

posted @ 2021-12-18 10:20  里列昂遗失的记事本  阅读(79)  评论(0)    收藏  举报