之前草草看了一遍,感觉很容易忘,果然还是要记点笔记。
这次目标是:python+web编程
[装饰器]
函数也是一个对象,可以赋值给变量:
def now(): print(‘hello‘) f=now() f() #调用now() print(f.__name__) #获得now()中__name__
现在要增强now()功能,但又不改原来now()代码,这种在代码运行期间动态增加功能的方式,称作装饰器(decorator).
本质上,装饰器是一个返回函数的函数,返回的的函数中封装了新功能与原有函数:
#给now添加功能:调用前打印__name__ def log(func): def wrapper(*args, **kw): print(‘%s‘ %func.__name__) return func(*args, **kw) return wrapper @log #装饰器语法 def now(): print(‘hello‘)
使用@log就能把log装饰器功能增加到now上面,这时调用now(),会在之前打印__name__
相当于执行了 now=log(now)
如果增加的功能中需要传入参数,要返回decorator的高阶函数:
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(‘someText‘) def now(): print(‘hello‘)
相当于执行了now=log(‘someText‘)(now)
现在还有一个问题,now是增加了功能,但因为返回的是wrapper函数,此时now.__name__是wrapper,要解决这个问题,需要用functools.wraps:
import functools def log(func): @functools.wraps(func) def wrapper(*args, **kw): print(func.__name__) return func(*args, **kw) return wrapper #或者带参数的 def log(text): def decorator(func): @functools.wraps(func) def wrapper(*args, **kw): print(‘%s : %s:‘ % (text, func.__name__)) return func(*args, **kw) return wrapper return decorator
以上内容摘自:http://www.liaoxuefeng.com/
其实就是大概敲了一遍... 不过起码仔细了一些...
时间: 2024-10-05 04:58:33