【每天1分钟】PYTHON基础之函数(装饰器)
1. 定义
装饰器也是一个函数,它是让其他函数在不改变变动的前提下增加额外的功能。
装饰器是一个闭包,把一个函数当作参数返回一个替代版的函数,本质是一个返回函数的函数(即返回值为函数对象)。
python3支持用@符号直接将装饰器应用到函数。
装饰器工作场景:插入日志、性能测试、事务处理等等。
函数被装饰器装饰过后,此函数的属性均已发生变化,如名称变为装饰器的名称。
2. 装饰器
2.1 被装饰的函数不带参数
>>> def my_decorator(func):
def inner():
print("**********")
print("要添加的功能代码")
func()
return inner
>>> def script1():
print("测试")
>>> script1()
测试
>>> runScript1 = my_decorator(script1)
>>> runScript1()
**********
要添加的功能代码
测试
>>> @my_decorator
def script1():
print("测试")
>>> script1()
**********
要添加的功能代码
测试
>>>
2.2 被装饰的函数带参数
可变参数args和关键字参数*kwargs添加函数通用的装饰器
>>> def my_decorator(func):
def inner(*args, **kwargs): # 可变参数*args和关键字参数**kwargs
print("**********")
print("要添加的功能代码")
func(*args, **kwargs)
return inner
>>>
>>> def script2(arg):
print("测试:%s" % arg)
>>> script2('abcde')
测试:abcde
>>>
>>> runScript2 = my_decorator(script2)
>>> runScript2("abcde")
**********
要添加的功能代码
测试:abcde
>>>
>>> @my_decorator
def script2(arg):
print("测试:%s" % arg)
>>> script2('abcde')
**********
要添加的功能代码
测试:abcde
>>>
2.3 装饰器带参数
>>> def my_decorator(name):
def outer(func):
def inner(*args, **kwargs):
print("********")
print("添加带装饰器参数%s的功能代码" % (name))
func(*args, **kwargs)
return inner
return outer
>>> def script3(arg):
print("测试----%s" % arg)
>>> script3("bbb")
测试----bbb
>>> runScript3 = my_decorator(name='settings')
>>> runScript3_1 = runScript3(script3)
>>> runScript3_1("bbb")
********
添加带装饰器参数settings的功能代码
测试----bbb
>>> runScript4 = my_decorator(name='settings')(script3)
>>> runScript4("bbb")
********
添加带装饰器参数settings的功能代码
测试----bbb
>>>
>>> @my_decorator(name='settings')
def script3(arg):
print("测试----%s" % arg)
>>> script3("bbb")
********
添加带装饰器参数settings的功能代码
测试----bbb
>>>
2.4 多个装饰器的执行顺序
>>> def my_decorator_1(func):
def inner():
print('1111111111111111111')
print('我是:my_decorator_1,')
func()
return inner
>>> def my_decorator_2(func):
def inner():
print('2222222222222222222')
print('我是:my_decorator_2,')
func()
return inner
>>> def my_decorator_3(func):
def inner():
print('3333333333333333333')
print('我是:my_decorator_3,')
func()
return inner
>>> def script4():
print('从上到下,调用次序是:my_decorator_1、my_decorator_2、my_decorator_3')
>>> script4()
从上到下,调用次序是:my_decorator_1、my_decorator_2、my_decorator_3
>>>
>>> @my_decorator_1
@my_decorator_2
@my_decorator_3
def script4():
print('从上到下,调用次序是:my_decorator_1、my_decorator_2、my_decorator_3')
# 等同于:my_decorator_1(my_decorator_2(my_decorator_3(script4)))
>>> script4()
1111111111111111111
我是:my_decorator_1,
2222222222222222222
我是:my_decorator_2,
3333333333333333333
我是:my_decorator_3,
从上到下,调用次序是:my_decorator_1、my_decorator_2、my_decorator_3
>>>