装饰器属于python高级语法,吉多创始的装饰器也是很精妙,通常我们会把装饰器称作语法糖。就好比,一颗树原本只有树叶和枝叉。
但是装上一些小饰品之后就变成了圣诞树。装饰器也是一样,他能给原本的函数添加一些功能,使函数在不改变原本代码的基础上具有不同的功能。
装饰器装饰前的函数是由闭包参数func指向,而装饰后的函数指向闭包的内部函数。道德上装饰器,装饰完的函数,在执行的时候不会去更改原先函数的返回值。
下面例举几个装饰器的例子:
# 无参,无返回
def set(func):
def inner_set():
print('添加功能')
func()
return inner_set
@set
def test():
print(1)
test()
# 无参,有返回
def set(func):
def inner_set():
print('添加功能')
return func()
return inner_set
@set
def test():
return 1
print(test())
# 有参,无返回
def set(func):
def inner_set(*args, **kwargs):
print('添加功能')
func(*args, **kwargs)
return inner_set
@set
# 相当于test = set(test)
def test(*args, **kwargs):
print('h', args)
print('b', kwargs)
test(1, 2, a=1, b=2)
# 有参,有返回
def set(func):
def inner_set(*args, **kwargs):
print('添加功能')
return func(*args, **kwargs)
return inner_set
@set
def test(*args, **kwargs):
print(args)
print(kwargs)
test(1,2,a=3,b=4)
# 万能装饰器
def set(func):
def inner_set(*args, **kwargs):
print('添加功能')
return func(*args, **kwargs)
return inner_set
@set
def test(*args, **kwargs):
print('test')
return 100
print(test())