python3 装饰器

Posted zjoe-life

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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)

 

以上是关于python3 装饰器的主要内容,如果未能解决你的问题,请参考以下文章

python3 装饰器

python3之装饰器

python3-装饰器

Python3装饰器

python3--装饰器

Python3装饰器