您的位置:首页 > 编程语言 > Python开发

Python基础17--装饰器

2015-03-14 22:59 375 查看

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  python 装饰器