Python基础 装饰器
Python的 decorator 本质上就是一个高阶函数,它接收一个函数作为参数,然后,返回一个新函数。
函数的属性
函数对象有一个name属性,可以取得到函数的名字
f = abs
print f.__name__ # 结果为'abs'
无参装饰器
- 声明装饰器函数
def log(f):
def fn(*args, **kw):
print ‘call ‘ + f.__name__ + '()…'
return f(*args, **kw)
return fn
- 使用装饰器
@log
def now():
print '2013-12-25'
now()
print now.__name__ # 结果为'fn'
- 实质
在定义函数时设置装饰器,实质上执行了以下功能
now = log(now)
带参装饰器
- 声明
def log(text):
def decorator(func):
def wrapper(*args, **kw):
print '%s %s():' % (text, func.__name__)
return func(*args, **kw)
return wrapper
return decorator
- 调用
@log('execute')
def now():
print '2013-12-25'
now()
print now.__name__ # 结果为'wrapper'
- 实质
now = log('execute')(now)
完善 返回函数的属性
- 定义
import functools
def log(func):
@functools.wraps(func) # 指定返回函数属性
def wrapper(*args, **kw):
print 'call %s():' % func.__name__
return func(*args, **kw)
return wrapper
- 调用
@log('execute')
def now():
print '2013-12-25'
print now.__name__ # 结果为'now'
- 实质
now = log(now)
如果不添加
@functools.wraps(func)
,返回值其实是wrapper
函数,即now = wrapper
,所以now.__name__
值为wrapper