函数式编程-装饰器
还是,先放代码
#_*_ 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,欢迎一起学习,一起交流进步

浙公网安备 33010602011771号