def Dec(func): #1
def wrapper():
print("hello") #3
func() #4
print("world") #5
return wrapper #2
@Dec
def func():
print("2019-12-31")
func()
'''
hello
2019-12-31
world
'''
执行顺序大致是这样,装饰函数相当于 func=Dec(func)
@wraps(func)
要使用这个必须导入functools
这个作用是消除(被装饰后的函数名等属性的改变)副作用
from functools import wraps
def Dec(func):
@wraps(func)
def wrapper():
print("hello")
func()
print("world")
return wrapper
@Dec
def func():
print("2019-12-31")
print(func.__name__,func.__doc__)
#加上 @wraps(func) 输出为func None
#不加 输出为wrapper None
使用普通装饰函数修饰类函数
def func(f):
def wrapper(Teacher):
print("------------")
f(Teacher)
return wrapper
class Teacher():
def __init__(self):
pass
@func
def Test(self):
print("hello")
a=Teacher()
a.Test()
因为调用a.Test()的时候有个隐藏参数self,所以wrapper里面要用个类名来进行接收
在用tornado做项目的时候有个需求,在调用每个接口的时候都要检查cookie是否有效(cookie这一套我使用的是jwt),基类是basehandler,如果cookie失效则重新登陆
def Verify(f):
def wrapper(basehandler):
try:
#检查cookie
cookie=basehandler.request.headers.get("Cookie",None)
#..................
else:
print("###########################")
err=Errorcode(-1,"重新登陆")
basehandler.set_status(401)
basehandler.finish(err)
except Exception as e:
err=Errorcode(-1,"重新登陆")
basehandler.set_status(401)
basehandler.finish(err)
return wrapper
@Verify
def get(self):
pass
每个接口都加个装饰即可