• 函数式编程-装饰器


      还是,先放代码

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

  • 相关阅读:
    LIKE谓词
    [C#网络编程系列]专题一:网络协议简介
    (zz)Sql Server 2005中的架构(Schema)、用户(User)、角色(Role)和登录(Login)(三)
    zz让你成功的九个心理定律
    zz给 VSTO 插件、文档传送参数
    重构笔记
    (zz)Sql Server 2005中的架构(Schema)、用户(User)、角色(Role)和登录(Login)(二)
    zzVSTO 先瘦身再发布:客户端配置文件
    zz将 VSTO 插件部署给所有用户
    (zz)Sql Server 2005中的架构(Schema)、用户(User)、角色(Role)和登录(Login)(一)
  • 原文地址:https://www.cnblogs.com/victorslave/p/10351741.html
Copyright © 2020-2023  润新知