功能: 在不修改源码和原有调用方式的情况下给函数添加额外功能;
又成为语法糖, 包装函数; 如要在函数的前面, 后面添加新的功能, 或更改函数的功能;
如下面的例子, 有个talk, 打印名字, 现在想要包装下,让打印时说的是”name love you”, 又不想直接懂函数talk, 就加上decorator
def love(func): def newTalk(word): return func(word) + "love you" return newTalk @love def talk(name): print(name) return name
love函数的参数是@love下面的函数对象, 就相当于 lova = newTalk, 即执行的是新定义的函数;原函数的参数是写到新函数newTalk里面;
装饰器传参数
如果要在原函数的执行前后座一些事, 可以往装饰器上传参数, 参数分别为执行前后函数; 但能用到的参数仍然为原函数参数
def love(func_before, func_after):
def outer(talk):
def wraper(name):
func_before(name)
talk(name)
func_after(name)
return warper
return outer
#no used
def newTalk(word):
return func(word) + "love you"
return newTalk
# 使用装饰器
@love(func_before, func_after)
def talk(name):
print(name)
return name