函数式编程-装饰器

  还是,先放代码

#_*_ 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,欢迎一起学习,一起交流进步

猜你喜欢

转载自www.cnblogs.com/victorslave/p/10351741.html