您的位置:首页 > 编程语言 > Python开发

Python——装饰器(两种不同的使用场景)

2018-01-31 20:02 387 查看
#例子,通过装饰器给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、这种语法允许我们动态的创建装饰过的函数对象,比如有多个不同功能的装饰器,
引入判断条件来使用不同的装饰器,也就是说可支持多种可选行为
'''
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  python 装饰器 场景