装饰器

作者: 她即我命 | 来源:发表于2018-12-01 15:32 被阅读0次
    """
    装饰器 - 用装饰函数去执行被装饰函数并添加额外的功能 - 代理模式
    程序中跟正常业务逻辑没有必然联系而且会重复使用的功能称为横切关注功能
    横切关注功能不应该写在业务逻辑代码上而应该使用装饰器或中间件来完成
    这种编程理念也被称为面向切面编程(AOP - Aspect Oriented Programming)
    """
    from functools import wraps
    from time import time, sleep
    from random import randint
    
    
    class RecordTime(object):
    
        def __init__(self, output):
            self.output = output
    
        def __call__(self, func):
    
            @wraps(func)
            def wrapper(*args, **kwargs):
                start = time()
                ret_value = func(*args, **kwargs)
                self.output(func.__name__, time() - start)
                return ret_value
    
            return wrapper
    
    
    """
    def record_time(output):
    
        def decorate(func):
    
            @wraps(func)
            def wrapper(*args, **kwargs):
                start = time()
                ret_value = func(*args, **kwargs)
                output(func.__name__, time() - start)
                return ret_value
    
            return wrapper
    
        return decorate
    """
    
    
    def log_to_db(fn, duration):
        pass
    
    
    def log_to_file(fn, duration):
        with open('result.log', 'a') as fs:
            fs.write('%s: %.3f秒\n' % (fn, duration))
    
    
    #@record_time(print)
    @RecordTime(print)
    def foo():
        print('hello, world!')
        sleep(randint(1, 5))
    
    
    def main():
        print(foo.__name__)
        for _ in range(3):
            # 此处调用foo函数真正执行的是wrapper函数
            foo()
        # 取消装饰器(获得被装饰之前的函数)
        foo2 = foo.__wrapped__
        for _ in range(3):
            # 此处调用的才是被装饰之前的真正的foo函数
            foo2()
    
    
    if __name__ == '__main__':
        main()
    

    相关文章

      网友评论

          本文标题:装饰器

          本文链接:https://www.haomeiwen.com/subject/ypcrcqtx.html