内容:记录python的装饰器
装饰器:
Python的装饰器(decorator)可以说是Python的一个神器,它可以在不改变一个函数代码和
调用方式的情况下给函数添加新的功能。
装饰器本质:
Python的装饰器本质上是一个嵌套函数,它接受被装饰的函数(func)作为参数,并返回一个包装
过的函数。这样我们可以在不改变被装饰函数的代码的情况下给被装饰函数或程序添加新的功能。
Python的装饰器广泛应用于缓存、权限校验、性能测试和插入日志等应用场景。
有了装饰器,我们就可以抽离出大量与函数功能本身无关的代码,增加一个函数的重用性。
装饰器使用场景:
你的程序一直运行也没啥问题,有一天突然需要增加临时新功能,为了过渡使用或者为了某个临时
活动而增加的功能,比如:618打折活动等。此时如果你去手动修改每个程序的代码一定会让你崩溃,
而且还破坏了那些程序的重用性。此时你可以编写一个@temp_function的装饰器
通用装饰器:
def set_fun(func):
def call_fun(*args, **kwargs):
print("装饰器中args参数", args)
print("装饰器中kwargs参数", kwargs)
return func(*args, **kwargs) # 拆包
return call_fun
@set_fun
def test(*args, **kwargs):
print("被装饰函数args",args)
print("被装饰函数kwargs",kwargs)
为通用装饰器传参:
# 装饰器传参:三个函数嵌套,最外层返回一个闭包的引用,最外层必须有参数
def set_value(value):
def set_fun(func):
def call_fun(*args, **kwargs):
print("装饰器参数:",value)
return func(*args, **kwargs)
return call_fun
return set_fun
为了解决这个问题保证装饰过的函数__name__属性不变,我们可以使用functools模块里的wraps方法,先对func变量进行wraps
def set_fun(func):
@wraps(func)
def call_fun(*args, **kwargs):
print("装饰器中args参数", args)
print("装饰器中kwargs参数", kwargs)
return func(*args, **kwargs) # 拆包
return call_fun
多个装饰器装饰同一个函数:
def decorator_one(func):
def wrapper(*args, **kwargs):
print('decorator one start')
result = func(*args, **kwargs)
print('decorator one end')
return result
return wrapper
def decorator_two(func):
def wrapper(*args, **kwargs):
print('decorator two start')
result = func(*args, **kwargs)
print('decorator two end')
return result
return wrapper
@decorator_two
@decorator_one
def hello_python():
print('Hello Python!')
hello_python()
结果:
decorator two start
decorator one start
Hello Python!
decorator one end
decorator two end