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):
u
=
"toby"
p
=
"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):
u
=
"toby"
p
=
"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):
u
=
"toby"
p
=
"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:
s
=
auth(show_name)
s(u, p)
else
:
show_name()
#show_name_strengthen()
show_name_strengthen(
True
,
"toby"
,
"1qaz#EDC"
)
'''
两种不同的语法,使用场景:
1、语法用@符号来使用装饰器,这种语法往往用于对不同的函数做永久性的更改
2、这种语法允许我们动态的创建装饰过的函数对象,比如有多个不同功能的装饰器,
引入判断条件来使用不同的装饰器,也就是说可支持多种可选行为
'''
|
本文转自 TtrToby 51CTO博客,原文链接:http://blog.51cto.com/freshair/2067479