Python 装饰器(fuctional decorators)是用于拓展原来函数功能的一种函数,目的是在不改变原函数名(或类名)的情况下,给函数增加新的功能。 这个函数的特殊之处在于它的返回值也是一个函数,这个函数是内嵌"原"函数的函数。
装饰器其实就是一个闭包函数,它是有两层的函数,它具有函数传参功能。
当在多个地方出现雷同的代码块,且这些代码与核心业务没有直接关联的都可以用装饰器来代替,装饰器不仅能减少代码量,还使得代码逻辑更清晰、可读性更强,你只需专注于业务逻辑处理就行了。
装饰器是可以叠加使用的,那么使用装饰器以后代码是啥顺序呢? 对于Python 中的“@”语法糖,装饰器的调用顺序与使用“@”语法糖声明的顺序相反。
首先,我们来回顾一下普通的装饰器,这是一个用于计算函数执行的耗时装饰器。
import time
def waste_time(func):
def function(*args,**kwargs):
start_time=time.time()
result=func(*args,**kwargs)
end_time=time.time()
spend=end_time-start_time
print("函数%s 总共耗时%.3f秒:"%(func.__name__,spend))
return result
return function
带参数的装饰器只需要在原来那个不带参数的装饰器基础上之上在最外层套一个函数,该函数中定义一个参数,然后嵌套函数中引用该参数即可实现。
再来,看看带参数的装饰器,这个装饰器可以通过传入参数的不同进行不同逻辑的处理:
def decorator_have_args(arg):
def function_out(function):
def function_in(*args,**kwargs):
print("the log is:%s"%arg)
print("call %s()"%function.__name__)
print("args={}".format(*args))
# print("kwargs={}".format(**kwargs))
if(arg=="flag1"):
function(*args,**kwargs)
elif(arg=="flag2"):
for i in range(3):
function(*args,**kwargs)
else:
print("pass")
return function_in
return function_out
@decorator_have_args("flag1")
def testa(a):
print("this is testa funcion,a=%s"%a)
@decorator_have_args("flag2")
def testb(b):
print("this is testb funcion,b=%s"%b)
@decorator_have_args("flagx")
def testc(c):
print("this is testb funcion,b=%s"%c)
if __name__ == '__main__':
testa("good")
testb("better")
testc("best")
今天的分享是:Python 中如何使用无固定参数的装饰器,让代码结构和逻辑更加清晰,以及Python 的具体实现。小伙伴们可以参考以上代码片段,将代码运行起来将更有助于理解装饰器的执行原理。
end
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有