首页 > 编程语言 > 详细

python3 装饰器

时间:2019-03-26 13:16:57      阅读:146      评论:0      收藏:0      [点我收藏+]

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

  要求:

    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 装饰器

原文:https://www.cnblogs.com/zjoe-life/p/10577494.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!