函数式编程-装饰器
Posted victorslave
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了函数式编程-装饰器相关的知识,希望对你有一定的参考价值。
还是,先放代码
#_*_ coding:utf-8 _*_ #1 def now(): print(‘2019-2-4‘) f=now f() print(now.__name__) print(f.__name__) #2 def log(func): def warpper(*args,**kw): print(‘call %s():‘%func.__name__) return func(*args,**kw) return warpper @log def now(): print(‘2019-2-4‘) now() #3 def log(text): def decorator(func): def wrapper(*args,**kw): print(‘%s %s():‘ % (text,func.__name__)) return func(*args,**kw) return wrapper return decorator @log(‘execute‘) def now(): print(‘2015-3-25‘) now() print(now.__name__) #4 import functools def log(func): @functools.wraps(func) def wrapper(*args,**kw): print(‘call %s():‘ % func.__name__) return func(*args,**kw) return wrapper @log def now(): print(‘2019-2-4‘) now() print(now.__name__) #5 import functools def log(text): def decorator(func): @functools.wraps(func) def wrapper(*args,**kw): print(‘%s %s():‘ % (text,func.__name__)) return func(*args,**kw) return wrapper return decorator @log(‘execute‘) def now(): print(‘2015-3-25‘) now() print(now.__name__) #exam import time,functools def metric(fn): @functools.wraps(fn) def w(*args,**kw): start=time.time() f=fn(*args,**kw) print(‘%s executed in %s ms‘ % (fn.__name__,time.time()-start)) return f return w # 测试 @metric def fast(x, y): time.sleep(0.0012) return x + y; @metric def slow(x, y, z): time.sleep(0.1234) return x * y * z; f = fast(11, 22) s = slow(11, 22, 33) if f != 33: print(‘测试失败!‘) elif s != 7986: print(‘测试失败!‘) #exam2写出一个@log的decorator,使它既支持:@log 又支持:@log(‘execute‘) def log(n): def decorator(fn): @functools.wraps(fn) def wrapper(args, **kwargs): print("begin call") f = fn(args, **kwargs) print("end call") return f return wrapper return decorator if isinstance(n,str) else decorator(n) @log def f(): pass @log(‘execute‘) def f(): pass
哦对了,这边我学习用的是廖老师那个教程,还是挺好用的,代码案例啥的都是那里的(不过貌似对新人不太友好)
了解装饰器之前,先说下闭包
python的函数需要一个返回值,而函数本身又是以变量形式呈现,于是我们不难想到,能否将python中的函数名称作为返回变量使用,这种做法就叫做闭包
当我们实现了一个函数,但需要一些新功能,或一些测试数据之类的东西,但又准备保持原函数不动,便可以使用装饰器来实现
@log:关于@的意义,即now = log(‘execute‘)(now),将后面定义的函数now作为log函数的名称
后面多重装饰器的代码中,实现了在log函数中加入变量
最后的exam2,实现了log同时可以接受变量和不接受变量的形式
以上
在下企鹅:1064864324,欢迎一起学习,一起交流进步
以上是关于函数式编程-装饰器的主要内容,如果未能解决你的问题,请参考以下文章