1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
#例子,通过装饰器给show_name()函数增加验证功能
 
#version 1 #普通函数不带参数,装饰器带参数
def  auth(func):
     # print(func.__name__) #通过打印这个结果得知,show_name函数被传入进来了
     def  auth_decorator(user, pwd):
         =  "toby"
         =  "1qaz#EDC"
         if  user  = =  u:
             if  pwd  = =  p:
                 print ( "auth done..." )
                 func()  #所以形式参数func等价于show_name()
             else :
                 print ( "password error" )
         else :
             print ( "not found user" )
     return  auth_decorator
 
@auth
def  show_name():
     print ( "my name is toby" )
 
show_name( "toby" , "1qaz#EDC" )
 
# #########################################################################################
#version 2 普通函数和装饰器都带参数
def  auth(func):
     # print(func.__name__) #通过打印这个结果得知,show_name函数被传入进来了
     def  auth_decorator(name, user, pwd):
         =  "toby"
         =  "1qaz#EDC"
         if  user  = =  u:
             if  pwd  = =  p:
                 print ( "auth done..." )
                 func(name)  #所以形式参数func等价于show_name()
             else :
                 print ( "password error" )
         else :
             print ( "not found user" )
     return  auth_decorator
 
@auth
def  show_name(name):
     print ( "my name is {0}" . format (name))
 
show_name( "ttr" "toby" , "1qaz#EDC" )
#此时就要把show_name函数看成是show_name(name, user, pwd)这样,传三个参数进去
 
# #########################################################################################
#version 3 下面的使用的语法,允许动态的创建装饰过的函数对象
def  auth(func):
     # print(func.__name__) #通过打印这个结果得知,show_name函数被传入进来了
     def  auth_decorator(user, pwd):
         =  "toby"
         =  "1qaz#EDC"
         if  user  = =  u:
             if  pwd  = =  p:
                 print ( "auth done..." )
                 func()  #所以形式参数func等价于show_name()
             else :
                 print ( "password error" )
         else :
             print ( "not found user" )
     return  auth_decorator
 
def  show_name():
     print ( "my name is juck" )
 
#在这个函数中用auth_enable参数来控制是否装饰show_name函数
#auth_enable参数为True,则必须提供user和pwd
#也就是说是开启验证和关闭验证由auth_enable来决定
def  show_name_strengthen(auth_enable = False , u = None , p = None  ):
     if  auth_enable:
         =  auth(show_name)
         s(u, p)
     else :
         show_name()
#show_name_strengthen()
show_name_strengthen( True "toby" "1qaz#EDC" )
 
 
'''
两种不同的语法,使用场景:
     1、语法用@符号来使用装饰器,这种语法往往用于对不同的函数做永久性的更改
     2、这种语法允许我们动态的创建装饰过的函数对象,比如有多个不同功能的装饰器,
     引入判断条件来使用不同的装饰器,也就是说可支持多种可选行为
'''