zoukankan      html  css  js  c++  java
  • 装饰器

    开放封闭原则: 对修改封闭对扩展开放
    装饰器,本身可以是任意可调用的对象,被装饰者也可以是任意可调用对象
    原则:1不能修改被装饰对象的源代码,2不能修改被装饰对象的调用方式
    目标:在遵循1和2的前提下为被装饰的对象添加上新的功能

    装饰器的用法:
    1#无参数的装饰器

    import time
    def wrapper(func):
        def inner(*args,**kwargs):
            start_time =time.time()
            res = func(*args,**kwargs)
            stop_time = time.time()
            print("run time is %s" %(stop_time-strat_time))
            return res
        return wrapper
    
            
    

    2#有参数的装饰器

    def wrapper(flag):
        if flag:
            def inner(func):
           
                        def inner1(*args,**kwargs):
                            #new method
                            res = func(*args,**kwargs)
                        return inner1
                    return inner
        else:
            return func
    

    3#装饰器语法
    被装饰函数的正上方,单独一行
    @deco1
    @deco2
    @deco3
    def foo():
    pass
    等价于 foo=deco1(deco2(deco3(foo)))

    装饰器的补充:wraps

    from functools import wraps
    def deco(func):
        @wraps(func) #加在最内层函数的正上方
        def wrapper(*args,**kwrags):
            return func(*args,**kwargs)
        return wrapper
    @deco
    def index():
        print("from index")
    print(index.__doc__)
    
    **使用wraps装饰器“装饰”过wrapper后,wrapper的__doc__、__name__等属性和deco要“装饰”的函数index的这些属性完全一样。**
    
  • 相关阅读:
    NOI 2016 区间 解题报告
    有关莫队
    [JSOI2008]最大数 线段树解法
    HDU P3341 Lost's revenge 题解+数据生成器
    BZOJ P1212 [HNOI2004] L语言
    洛谷P3168 [CQOI2015]任务查询系统
    普通平衡树Tyvj1728、luogu P3369 (splay)
    洛谷P3384 树链剖分
    BZOJ P2157 旅游
    【算法导论】第6章,堆排序
  • 原文地址:https://www.cnblogs.com/bigcatbc/p/10554599.html
Copyright © 2011-2022 走看看