Python装饰器的作用是在不改变原有函数的基础上,对函数的功能进行增加或者修改。
装饰器语法是Python语言更加优美且避免很多繁琐的事情,flask中配置路由的方式便是装饰器。
首先python中一个函数也是可以当做一个对象进行传递的。
def linuxidc(f):
def she():
print("I'm a linuxidc")
return f()
return she
@linuxidc
def linuxmi():
print("I'm a linuxmi")
if __name__ == "__main__":
linuxmi()
输出结果为
I'm a linuxidc
I'm a linuxmi
上面代码相当于
linuxmi = linuxidc(linuxmi)
linuxmi()
带参数的装饰器
def change(a):
def linuxidc(f):
def she():
print("I'm a linuxidc")
f()
print("you're not ,you're {} linuxidc".format(a))
return she
return linuxidc
@change("fake")
def linuxmi():
print("I'm a linuxmi")
if __name__ == "__main__":
linuxmi()
结果:
I'm a linuxidc
I'm a linuxmi
you're not ,you're fake linuxidc
相当于
linuxmi = change("fake")(linuxmi)
linuxmi()
其实函数名此时发生了改变
linuxmi.__name__的值为she
解决办法为使用functools.wraps
import functools
def change(a):
def linuxidc(f):
@functools.wraps(f)
def she():
print("I'm a linuxidc")
f()
print("you're not ,you're {} linuxidc".format(a))
return she
return linuxidc
def linuxmi():
print("I'm a linuxmi")
if __name__ == "__main__":
linuxmi = change("fake")(linuxmi)
linuxmi()