装饰器是个好东西啊
那么装饰器是个什么样的东西呢,他又能做些什么呢?
1.为什么装饰器
当我们一个程序已经构建完成,并且已经发布出去了,但是现在需要增加一个活动,例如淘宝给你发送一个今日优惠,或者开启了一个双十一的活动。那么我们如何去做呢?
看一下下面的例子
1 def sai_hi(): 2 print('hi') 3 4 def text(func): 5 print('活动开始') 6 func() 7 print('活动结束') 8 text(sai_hi)
答案是这样
活动开始
hi
活动结束
我们看到我们已经为这个sai_hi的活动增加了一个开始和结束的功能
但是还是不够完美
源代码在发布出去之后是不能随意修改的 ,因为一但修改源代码可能导致非常多的bug出现,越改越多
所以我们需要在不改变源代码的基础上为目标增加功能怎么做呢?
1 def text(func): 2 def text1(): 3 print("活动开始") 4 func() 5 print("后的结束") 6 return text 7 8 @text # 那么这个@text的意思就是 sai_hi=text(sai_hi) 9 def sai_hi(): 10 print('hi') 11 12 sai_hi()
那么只需要这样就给函数安全的加上功能啦
那么当我们大函数需要传入参数呢?
1 def timer(func): 2 def deco(*args,**kwargs): 3 satr_time = time.time() 4 func(*args,**kwargs) 5 stop_time = time.time() 6 print('the run time is %s' % (stop_time - satr_time)) 7 return deco 8 @timer# text1=timer(text1) 9 def text1(): 10 time.sleep(2) 11 print('in the text1') 12 @timer 13 def text2(name): # ------------------------------------------------------------------------------------往里面传值 14 time.sleep(3) 15 print('in the text2:',name) 16 17 text1() 18 text2('miki')
是不是只需要都在第二阶里面加上参数就可以了?
那么还有更高级的用法哦
这样想 当我们非常的的模块 现在其中有几个模块为了安全现在需要登录验证,然而有些却不要
或者是我现在要验证,可能过几天要向非会员什么的免费开放几天。这个时候问题来了
在不该边源代码的情况下怎么做?我们的装饰器最高阶版就可以完成这项工作
1 name,password='miki','abc123' 2 def foo(auth_type): 3 print("the foo",auth_type) 4 def math(func): 5 print("in the math") 6 def deco(*args,**kwargs): 7 if(auth_type=='local'): 8 usename=input('your name:').strip() 9 usepassword=input('your password:').strip() 10 if(name==usename and password==usepassword): 11 print('