1 致谢
3 装饰器的形式
我们先来看看一个简单的装饰器的模板:
def decorator(func):
def wrapper(*args, **kw):
print('call %s():' % func.__name__)
return func(*args, **kw)
return wrapper
这里的decorator就是装饰器函数的名称,(这里装饰器的函数名是可以自定义的,这里我们就使用decorator,装饰器的英文单词,来作为函数名,以方便理解);
这里的wrapper函数是对被装饰的函数func的内部封装,正如其单词本身“包装者”的意思,这里包装器的函数名也是可以任意定义的,这里就使用wrapper作为函数名;
4 装饰器编程的高级技巧
这里我们用廖老师教程中的一个题目来讲述一下如何使用装饰器来编写更复杂的函数,
首先,我们来看看廖老师给出的习题,
一个实现代码是这样的:
def log(*params):
if len(params) == 1 and callable(params[0]):
func = params[0]
else:
func = None
def decorator(f):
def wrapper(*args, **kwargs):
print('%s before call' % f.__name__)
ret = f(*args, **kwargs)
print('%s end call' % f.__name__)
return ret
return wrapper
return decorator(func) if func else decorator
我们来看看这段代码,callable刚开始的时候我不熟悉,我们来看看它的用法,
这里我们引用菜鸟教程中关于callable的描述,
所以callable函数可以用来判断一个对象是否是一个函数;