概述:python装饰器属于进阶必学的,很多人刚学是很难明白的,这里用比较容易懂的方式简单讲一下:(注意:这里需要函数的基础知识)
第一步:
我们有一个函数,比如一个求和的函数:
def sum_test(): sum=12+20 print(sum)
如果我们需要去再函数中前后加入开始跟结束打印用于调试,常规可能处理的办法是去修改这个函数,如下操作:
def sum_test(): print("-----开始计算-----") sum=12+20 print(sum) print("-----结束计算-----")
在前后输入print()来处理
第二步:
如果我有更多的函数需要调试呢,都去修改原来已经封装好的函数?一个一个去加入print的话也会很慢,有没有更好的办法?不错,可以再定义一个调试函数,然后去函数中去调用被调试函数,如下:
def sum_test(): sum=12+20 print(sum) def pr_test(func): print("-----开始计算-----") func() print("-----结束计算-----") if __name__ == '__main__': pr_test(sum_test)
上面的方法通过pr_test()调用函数sum(),能避免重复的去修改,但是我们每次要给pr_test()传参数,这也是一个不轻松的活啊,这个时候装饰器就闪亮登场了,先来了把pr_test()包装成一个装饰器:
def pr_test(func): def out_test(): print("-----开始计算-----") func() print("-----结束计算-----") return out_test def sum_test(): sum=12+16 print(sum) if __name__ == '__main__': res=pr_test(sum_test) res()
这样一个简易的装饰器就做好了,我们只需要在定义sum_test以后调用sum_test之前,加上res= pr_test(sum_test),就可以达到计时的目的;
这也就是装饰器的概念,看起来像是sum_test被pr_test装饰了(有没有函数被装修的感觉,我是一个粉刷墙,粉刷本领强啊)!
我们的Python提供了一个语法糖来降低字符输入量。就是@pr_test,用法如下:
def pr_test(func): def out_test(): print("-----开始计算-----") func() print("-----结束计算-----") return out_test @pr_test def sum_test(): sum=12+16 print(sum) if __name__ == '__main__': sum_test()
通过@pr_test,我们就完成了一个装饰器的功能,以后任何有需要的函数,需要加调试代码(可以是任何公用功能),那么我们在前面加上这个@func(对应函数名)就可以了,大家有没有掌握到python装饰器的概念呢?
大幅度发是的发送到