Python 装饰器笔记
2016-01-21 04:48
579 查看
一、装饰器无参数
1.原函数无参数
defwrap_in_tag_b(fn):#wrap_in_tag_b是真正的装饰器 defwrapped(): return"<b>"+fn()+"</b>" returnwrapped defwrap_in_tag_i(fn): defwrapped(): return"<i>"+fn()+"</i>" returnwrapped @wrap_in_tag_b @wrap_in_tag_i defhello(): return"hello" print(hello())#returns"<b><i>helloworld</i></b>"
2.原函数带参数
defwrap_in_tag_b(fn): defwrapped(arg):#arg是原函数参数 return"<b>"+fn(arg)+"</b>" returnwrapped defwrap_in_tag_i(fn): defwrapped(arg):#arg是原函数参数 return"<i>"+fn(arg)+"</i>" returnwrapped @wrap_in_tag_b @wrap_in_tag_i defhello(name): return"hello{}".formar(name) print(hello('Jack'))
二、装饰器带参数
1.原函数无参数
defwrap_in_tag(deco_arg): #装饰器参数:deco_arg #可以在任意位置使用 defreal_decorator(func):#real_decorator才是即将返回的真正的装饰器 #原函数参数:func_arg #只可以在此位置使用 defwrapped(): return"<{0}>{1}</{0}>".format(deco_arg,func()) returnwrapped returnreal_decorator @wrap_in_tag('b') @wrap_in_tag('i') defhello(): return"hello" print(hello())
2.原函数带参数
defwrap_in_tag(deco_arg): #装饰器参数:deco_arg #可以在任意位置使用 defreal_decorator(func):#real_decorator才是即将返回的真正的装饰器 defwrapped(func_arg): #原函数参数:func_arg #只可以在此位置使用 return"<{0}>{1}</{0}>".format(deco_arg,func(func_arg)) returnwrapped returnreal_decorator @wrap_in_tag('b') @wrap_in_tag('i') defhello(name): return"hello{}".format(name) print(hello('Jack'))
三、装饰器类
1.原函数无参数
classwrap_in_tag(object): def__init__(self,deco_arg): self.tag=deco_arg#装饰器参数:deco_arg def__call__(self,func): defnewf():#原函数无参数 return"<{0}>{1}</{0}>".format(self.tag,func()) returnnewf @wrap_in_tag('b') @wrap_in_tag('i') defhello(): return'hello' print(hello())
2.原函数带参数
classwrap_in_tag(object): def__init__(self,deco_arg): self.tag=deco_arg#装饰器参数:deco_arg def__call__(self,func): defnewf(func_arg):#原函数参数:func_arg return"<{0}>{1}</{0}>".format(self.tag,func(func_arg)) returnnewf @wrap_in_tag('b') @wrap_in_tag('i') defhello(name): return"hello{}".format(name) print(hello('Jack'))
四、用装饰器装饰类
1.用函数作为装饰器
defwrap_in_tag(deco_arg): defreal_decorator(func): defwrapped(self,func_arg):#类方法接收第一个参数都是self,这个必须有,而无论func_arg是否有!!! return"<{0}>{1}</{0}>".format(deco_arg,func(func_arg)) returnwrapped returnreal_decorator classfoo(object): @wrap_in_tag('b') @wrap_in_tag('i') defhello(self,name): return'hello{}".format(name) @wrap_in_tag('b') @wrap_in_tag('i') defbyebye(self,name): return'byebye{}".format(name) f=foo() print(f.hello('Jack')
2.用类作为装饰器
classwrap_in_tag(object): def__init__(self,deco_arg): self.tag=deco_arg def__call__(self,func): defnewf(slf,func_arg):#slf必须!self被占用了,那就给第一个参数另一个名字slf(随便) return"<{0}>{1}</{0}>".format(self.tag,func(func_arg)) returnnewf classfoo(object): @wrap_in_tag('b') @wrap_in_tag('i') defhello(self,name): return'hello{}".format(name) @wrap_in_tag('b') @wrap_in_tag('i') defbyebye(self,name): return'byebye{}".format(name)
f=foo() print(f.hello('Jack'))
相关文章推荐
- 第六章 学习笔记
- python类型转换、数值操作
- Mac OS X 10.11.1下搭建Python3.4 + PyQt5.5.1 +Eric6.1.1开发平台
- python subprocess.Popen简明总结
- python-78:对日期格式进行处理
- python-79:为什么要对日期进行处理
- python-80:获取文章的内容
- python-81:交互
- python-82:交互部分模拟实现的源码
- python-83:公务员时间源码 V-0.1
- python解析html
- xpath使用小结
- python核心编程-线程threading模块之生产者与消费者
- python 写99乘法表
- python 写99乘法表
- python核心编程-线程threading模块之单线程多线比较
- Python 5.5 使用枚举类
- python核心编程-线程threading模块之四
- python核心编程-线程threading模块之三
- 使用python+selenium完成qq空间自动登录小程序