学设计模式中有个装饰模式,用java实现起来不是很难,但是远远没有python简单,难怪越来越火了!
这里就简单讨论下python的几种装饰模式:
<强>一无参装饰器:强>
#装饰器 导入的时间 #装饰器,记录函数运行时间 def decorator01(有趣的): def wap (): 少许=time.time () 有趣的() 结束=time.time () print(“有趣的运行时间是{}”。格式(时间=结束-少许)) 返回wap #必须要返回一个函数的内存地址 #使用装饰器装饰某个函数,等价于test01=decorator01 (test01), #即将test01实际引用变成wap函数内存地址,所以执行test01实际是执行wap @decorator01 def test01 (): time . sleep (2) print (“test01运行”) test01() #不修改代码和调用方式,实现添加记录时间功能
<强>二函数带参装饰器:强>
#装饰器 导入的时间 #装饰器,记录函数运行时间 def decorator01(有趣的): def wap (* args, * * kwargs): #使用非固定参数,无论参数是什么,都可以传递进来 少许=time.time () 乐趣(* args, * * kwargs) 结束=time.time () print(“有趣的运行时间是{}”。格式(时间=结束-少许)) 返回wap #必须要返回一个函数的内存地址 # test01 ()=wap(),所以装饰器加参数是给嵌套函数加参数 @decorator01 def test01 (args1): time . sleep (2) 打印(“参数是{名称}”.format (NAME=args1)) test01(“侯征”)#不修改代码和调用方式,实现添加记录时间功能
<强>三装饰器本身带参数的装饰器:强>
#装饰器 导入的时间 #如果装饰器有参数,最外层是装饰器的参数 def decorator01 (* args, * * kwargs): 打印(“装饰器参数:“,* args, * * kwargs) def(有趣):#第二层才是接受的函数 def wap (* args, * * kwargs): #使用非固定参数,无论参数是什么,都可以传递进来 少许=time.time () 乐趣(* args, * * kwargs) 结束=time.time () print(“有趣的运行时间是{}”。格式(时间=结束-少许)) 返回wap #必须要返回一个函数的内存地址 返回了#要返回装饰函数的内存地址 #装饰器本身带参数,此时decorator01 (arg)=,即相当于@out装饰test01,所以test01(有趣)=wap=@decorator01 (1) def test01 (args1): time . sleep (2) 打印(“参数是{名称}”.format (NAME=args1)) test01(“侯征”)#不修改代码和调用方式,实现添加记录时间功能
这种一开始挺难理解的,但是只要记住一点,@语法糖装饰器的作用就是给被装饰的函数重新赋一个函数的内存地址,即装饰器内部定义的那个
和你直接<代码> fun01=装饰(有趣)> 代码,然后<代码> fun01() 代码>是一样的,只是这样写不用改变原来调用方式
@decorator
def有趣():
引用>即就是<代码>有趣=装饰(有趣)代码>所以,当装饰器有参数时,还需要返回一个函数,这个函数才是用来装饰作用的,<代码>装饰(1)=> 代码,即<代码>有趣=(有趣)> 代码! !
所以外面再包一层就行了,其实就相当于<代码> @decorator (1)=@out> 代码,即<代码>装饰(1)=> 代码,实际装饰器时,只不过<代码>装饰(1)代码>返回了一个从这样理解就简单多了,无参的@就是起赋值作用
以上就是python装饰器三种装饰模式的简单分析的详细内容,更多关于python装饰模式的资料请关注其它相关文章!
python装饰器三种装饰模式的简单分析