zoukankan      html  css  js  c++  java
  • 快速理解Python装饰器

    话不多说,直接上重点:

    本质:Python函数
    功能:可以让其他函数在不需要做任何代码变动的前提下增加额外功能,装饰器的返回值也是一个函数对象
    主要需求场景:性能测试、插入日志、事务处理、缓存、权限校验等
    优势:可以抽离出大量与函数功能本身无关的雷同代码并继续重用,即:为已经存在的对象添加额外的功能

    实验代码:

    # 初级版
    def use_logging(func):
        def wrapper(*args, **kwargs):
            # logging.warning("{} is running...".format(func.__name__))
            print("{} is running...".format(func.__name__))
            return func(*args, **kwargs)
        return wrapper
    
    def bar():
        print("I am a bar")
    
    # bar = use_logging(bar)
    # bar()
    
    # 标准版
    @use_logging
    def foo():
        print("I am a good boy")
    foo()
    print("*"*20)
    
    # 带参数装饰器
    def use_logging_v2(level):
        def decorate(func):
            def wrapper(*args, **kwargs):
                # logging.warning("{} is running...".format(func.__name__))
                print("{} is running...".format(func.__name__))
                return func(*args, **kwargs)
            return wrapper
        return decorate
    
    @use_logging_v2(level=3)
    def brother():
        print("I am a bigger boy")
    
    brother()
    
    # 性能分析监视器
    def calc_time(func):
        def wrapper(*args, **kwargs):
            print("This is {} spent time".format(func.__name__), end=':')
            t1 = time.time()
            func(*args, **kwargs)
            t2 = time.time()
            print(t2-t1)
        return wrapper
    
    @calc_time
    def worker(steps):
        walks = [1] * steps
    
    @calc_time
    def doctor(steps):
        walks = [1 for i in range(steps)]
    
    nums = 100000000
    print("*"*20)
    worker(nums)
    doctor(nums)

    结果展示:

    时刻记着自己要成为什么样的人!
  • 相关阅读:
    UVA 11019 Matrix Matcher ( 二维字符串匹配, AC自动机 || 二维Hash )
    蓝桥杯 修改数组 (巧用并查集)
    luoguP3242 [HNOI2015]接水果
    CF757F Team Rocket Rises Again
    luoguP2597 [ZJOI2012]灾难
    luoguP4103 [HEOI2014]大工程
    luoguP3233 [HNOI2014]世界树
    luoguP2495 [SDOI2011]消耗战
    CF613D Kingdom and its Cities
    51nod 1584 加权约数和
  • 原文地址:https://www.cnblogs.com/demo-deng/p/14667381.html
Copyright © 2011-2022 走看看