码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2018-01-31 22:21:33      阅读:219      评论:0      收藏:0      [点我收藏+]

标签:__name__   ret   error   开启   ...   orm   for   false   支持   

#例子,通过装饰器给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——装饰器(两种不同的使用场景)

标签:__name__   ret   error   开启   ...   orm   for   false   支持   

原文地址:http://blog.51cto.com/freshair/2067479

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!