python3 装饰器

一、装饰器的本质是函数:

  要求:

    1.不能修改被装饰函数的源代码

    2.不能修改被装饰函数的调用方式

    3.装饰函数对于被装饰函数透明(即不调用时,感觉不到其存在)

  实现方式:

  1. 函数即“变量”,函数名指向内存中的函数体,加()表示调用
  2. 高价函数,将函数当做参数传递给其他函数
  3. 嵌套函数,在函数体内再定义函数

  应用场景(举例):插入日志、性能测试、事务处理、缓存、权限验证等场景

 

二、装饰器实例:

  不带参数的装饰器:

1 def debug(func):
2     def wrapper():
3         print ("[DEBUG]: enter {}()".format(func.__name__))
4         return func()
5     return wrapper
6 
7 @debug
8 def say_hello():
9     print ("hello!")

   装饰器执行顺序:

    以上面的代码为例执行顺序为:

    ----> @debug (程序执行先扫描程序中的 装饰器) <======> say_hello = debug(say_hello)

    ----> debug(func) (跳转进入装饰器,下一步 , 返回装饰器函数中的 wapper函数的内存地址)func <=======> say_hello

    ----> 调用 say_hello()方法后,会跳入装饰器中的wapper函数

    ----> 执行wapper函数

    ----> 执行 print()

    ----> 返回 func() <=============> say_hello函数 同时执行 say_hello中的 print方法

  所以至此可以看出 装饰器原理就是把say_hello函数包起来执行,先验证后执行。

  带参数的装饰器:

 1 def login(funct):
 2     def inner(*args,**kwargs):
 3         print('passed user veriftcation...')
 4         return funct(*args,**kwargs)   #inner的返回值就是tv的返回值
 5     return inner
 6 
 7 #@login
 8 def tv(*args,**kwargs):
 9     print('welcom %s to TV page %s' %(args,kwargs))
10     return 88    #返回值
11 tv = login(tv)
12 dic = {'k1':'v1','k2':'v2'}
13 li = ['python','java']
14 t = tv(dic,li)
15 print(t)

三、简单的登录验证实例:

 1 user_list = [
 2     {'name':'a1','passwd':'123'},
 3     {'name':'b2','passwd':'123'},
 4     {'name':'c3','passwd':'123'},
 5     {'name':'d4','passwd':'123'}
 6 ]
 7  
 8 #初始状态,用来保存登陆的用户,
 9 client_dic = {'username':None,'login':False}
10  
11 #添加新功能
12 def auth_func(func):
13     def wrapper(*args,**kwargs):
14         #参数检查,判断是否有用户登录,如果有,不用验证,直接执行函数的功能
15         if client_dic['username'] and client_dic['login']:
16             res = func(*args,**kwargs)
17             return res
18  
19         #输入用户名和密码
20         username = input('用户名:').strip()
21         passwd = input('passwd:').strip()
22  
23         #对比列表,检查用户名和密码是否正确
24         for user_dic in user_list:
25             if username == user_dic['name'] and passwd == user_dic['passwd']:
26                 client_dic['username'] = user_dic['name']
27                 client_dic['login'] = True
28                 res = func(*args,**kwargs)
29                 return res
30         else:
31             print('用户名或者密码错误!')
32     return wrapper
33  
34 @auth_func
35 def index():
36     print("欢迎来到主页")
37  
38 @auth_func
39 def home(name):
40     print("欢迎回家:%s"%name)
41  
42 @auth_func
43 def shoppping_car():
44     print('购物车里有[%s,%s,%s]'%('可乐','薯条','洗衣粉'))
45  
46 print(client_dic)
47 index()
48 print(client_dic)
49 home('root')

 

posted @ 2019-03-26 12:50  戏游人生  阅读(101)  评论(0编辑  收藏