一、什么是python装饰器(Decorators)
定义:python的装饰器:装饰原有的函数,用于拓展原来函数功能的一种函数,在不更改原来函数代码的基础上,增加函数的功能。
格式:@ 符号就是装饰器的语法糖,它放在函数开始定义的地方,这样就可以省略最后一步再次赋值的操作。
二 、装饰器返回值及用处
装饰器的返回值也是一个函数/类对象。它经常用于有切面需求的场景,比如:插入日志、性能测试、事务处理、缓存、权限校验等场景,装饰器是解决这类问题的绝佳设计。
装饰器的具体详解可学习此链接
三、用法:
1、函数装饰器
用@函数名,装饰器可以嵌套函数,分为装饰器带参数和不带参数的。用法可参照以下代码使用。
代码引用自:
def demo1(demo_name):
def wrapper(fun):
print(demo_name, "wrapper")
fun()
# end def
@wrapper
def test():
print(demo_name, "test")
# end def
test # 调用test方法,此处不能加()。
# end def(demo)
def demo2(demo_name): #可以创建嵌套的函数,函数也能返回函数
def wrapper(func):
def callback(*args, **kwargs):
print(demo_name, "callback")
return func(*args, **kwargs)
return callback
# end def
@wrapper
def test(item):
print(demo_name, "test", item)
# end def
test("Hello") # 调用test方法
# end def(demo)
def demo3(demo_name):
def decorate(tip):
def wrapper(func):
def callback(*args, **kwargs):
print(demo_name, tip)
return func(*args, **kwargs)
return callback
return wrapper
# end def(decorate)
@decorate("Something") # 带参数的装饰器
def test(item):
print(demo_name, "test", item)
# end def
test("Hello") # 调用test方法
# end def(demo)
if __name__ == '__main__':
demo1("demo1")
print()
# 被装饰函数传参
demo2("demo2")
print()
# 装饰器传参
demo3("demo3")
print()
2、类装饰器:
class Foo(object):
def __init__(self, func):
self._func = func
def __call__(self):
print ('class decorator runing')
self._func()
print ('class decorator ending')
@Foo
def bar():
print ('bar')
bar()
functools.wraps
四、装饰器的执行顺序:
一个函数还可以同时定义多个装饰器,从内向外的调用,执行顺序是从里到外,最先调用最里层的装饰器,最后调用最外层的装饰器
@a
@b
@c
def f ():
pass
等价于:
f = a(b(c(f)))
来源:CSDN
作者:笨小鱼
链接:https://blog.csdn.net/gu305524073/article/details/103801338