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-ChatterBot搭建不同adapter的聊天机器人(使用NB进行场景分类)
- 用两种不同的方法导出ORACLE 查询数据为CSV 文件 (python 代码 与 使用 utl_file 包)
- 基于Python-ChatterBot搭建不同adapter的聊天机器人(使用NB进行场景分类)
- 使用EditText在不同场景下调用软键盘的总结
- Python: 使用装饰器“@”取得函数执行时间
- Python:使用threading模块实现多线程编程二[两种方式起线程]
- Python:使用threading模块实现多线程编程二[两种方式起线程]
- oracle 两种方法不同的效率!务必少使用 not in
- 不同的应用场景推介使用的OpenCL Paths
- 使用 Scene 类在 XNA 中创建不同的场景(八)
- 使用 Scene 类在 XNA 中创建不同的场景(八)
- 两种不同TableView的使用(代码)
- 国内外三个不同领域巨头分享的Redis实战经验及使用场景
- Python模块在使用中的两种导入方法
- WPF中两种不同的视频流的使用
- Context:让不同场景使用不同扩展的 Chrome 扩展
- 数据同步框架MS Sync Framework-不同场景使用例子和简要分析
- python--打印不同颜色的使用方法和数字对应颜色对照表
- 使用委托,满足不同的场景,开放封闭原则