我在学习python的时候老师和我说的第一句话就是
装饰器是个好东西啊
那么装饰器是个什么样的东西呢,他又能做些什么呢?
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 @timer13 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('\033[31;1m you success \033[0m')12 res = func(*args,**kwargs)13 return res # -----------------------------------原本装饰后使得func的返回值没有了 这里使得返回值出现14 else:15 print('\033[31;1m username or password error \033[0m')16 elif(auth_type=='ldap'):17 res = func(*args, **kwargs)18 return res19 return deco20 return math21 def index():22 print('welcome to indext page')23 @foo(auth_type='local') # home =foo(home)24 def home(miki):25 print('welcome to home page',name,miki)26 return ' form home'27 @foo(auth_type='ldap')28 def bbs():29 print('welcome to bbs page')30 index()31 miki=input('your age:')32 home(miki)33 bbs()
那么此时的foo里面传入的参数可以提供验证,当验证通过则免登录。
程序可以自行理解一下