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

      

    装饰器

     
    复制代码
    import time
    def timmer(func):
        #函数名可以当做函数的参数
        def inner():
            start = time.time()
            func()
            end = time.time()
            print(end - start)
        return inner
    
    def hahaha():
        time.sleep(0.1)
        print('aaaa')
    
    #hahaha()
    # timmer(hahaha)
    #我们不能修改这个函数的调用方式
    #也不能修改原代码
    # hahaha = timmer(hahaha)  #timmer函数的地址给了hahaha
    # hahaha()  #实际上执行的是timmer
    
    import time
    def timmer(func):
        #函数名可以当做函数的参数
        def inner():
            start = time.time()
            func()
            end = time.time()
            print(end - start)
        return inner
    
    def hahaha():
        time.sleep(0.1)
        print('aaaa')
    
    # hahaha = timmer(hahaha)  #timmer函数的地址给了hahaha
    # hahaha()
    
    # def timmer(func):  #---> hahaha
    #     def inner(x,y):
    #         func(x,y)  # --->hahaha
    #     return inner
    #
    # def hahaha(a,b):
    #     time.sleep(0.1)
    #     print(a,b)
    #
    # hahaha = timmer(hahaha)
    # #我们不能修改这个函数的调用方式
    # hahaha(1,2)  #==>inner(1,2)
    
    def timmer(func):  #---> hahaha
        def inner(x,y):
            func(x,y)  # --->hahaha
        return inner
    
    def hahaha(a,b):
        time.sleep(0.1)
        print(a,b)
    
    def kkk(a):
        print(a)
    
    # hahaha = timmer(hahaha)
    # hahaha(1,2) #inner(1,2)
    
    def timmer(func):  #---> hahaha
        def inner(*args,**kwargs):
            #args == (1,2)  kwargs == {}
            #*args == 1,2   **kwargs == a =1,b = 2
            func(*args,**kwargs)  # --->hahaha
        return inner
    
    
    def kkk(a):
        print(a)
    
    kkk = timmer(kkk)
    # kkk(1)
    
    
    def timmer(func):  #---> jjj
        def inner(*args,**kwargs):
            ret = func(*args,**kwargs)  # --->ret = jjj()
            return ret
        return inner
    
    @timmer  #jjj = timmer(jjj)  语法糖
    def jjj():
        return 123
    
    # jjj = timmer(jjj)
    ret = jjj()  #==>inner
    
    #装饰器的本质 :闭包函数
    #功能:就是在不改变原函数调用方式的情况下,在这个函数前后加上扩展功能
    def timmer(func):
        def inner(*args,**kwargs):
            '''添加函数调用之前的扩展代码'''
            ret = func(*args,**kwargs)
            '''添加函数调用之后的扩展代码'''
            return ret
        return inner
    #设计模式 原则 开放封闭原则
    #对扩展是开放的
    #对修改是封闭的
    
    
    def wrapper(func):#装饰
        def inner(*args,**kwargs):
    
            ret = func(*args,**kwargs)
    
            return ret
        return inner
    
    @wrapper
    def aaa():
        print('asghksdlhf')
    
    @wrapper
    def bbb():
        print('asghksdlhf')
    
    # aaa()
    # bbb()
    # aaa()
    # bbb()
    import time
    def wrapper(func):  # 装饰
        def inner(*args, **kwargs):
            start = time.time()
            ret = func(*args, **kwargs)
            end = time.time()
            print(end - start)
            return ret
        return inner
    
    @wrapper
    def lll():
        time.sleep(0.1)
        print('hello')
    
    lll()
    复制代码

    一、带参数的装饰器;------开关

    复制代码
    __author__ = 'Administrator'
    F=True
    def outer(F):
        def wap(fun):#gg
            def inner(*args,**kwargs):
                if F:
                    print("inner   before")
                    ret=fun(*args,**kwargs)#gg()
                    print("inner   after")
                else:
                    ret=fun(*args,**kwargs)
                return  ret
            return inner
        return wap
    
    @outer(F) #先执行out(F) ----@wap----->gg=wap(gg)
    def gg():
        print("gg............")
    gg()#inner()
    复制代码

    二、多个装饰器装饰一个函数

    复制代码
    __author__ = 'Administrator'
    def yn(fun):#fun=sc_inner
        def yn_inner(*args,**kwargs):
            print("yun..........before")
            ret=fun(*args,**kwargs)#sc_inner()
            print("yn...........after")
            return ret
        return yn_inner
    
    def sx(fun):#fun=china
        def sx_inner(*args,**kwargs):
            print("sx..........before")
            ret=fun(*args,**kwargs)#china()
            print("sx...........after")
            return ret
        return sx_inner
    
    @yn #china=yn(china)-----china=yn(sx(china))----china=yn(sx_inner)---->china=yn_ineer
    @sx  #china=sx(china)----china=
    def china():
        print("china is good ")
    
    china()#yn_inner()
    复制代码

    三、装饰器的一个应用

    复制代码
    l = []
    def wrapper(func):
        l.append(func)  #统计当前程序中有多少个函数被装饰了
        def inner(*args,**kwargs):
            #l.append(func)  #统计本次程序执行有多少个带这个装饰器的函数被调用了
            ret = func(*args,**kwargs)
            return ret
        return inner
    
    @wrapper  #f1 = wrapper(f1)
    def f1():
        print('in f1')
    
    @wrapper #f2 = wrapper(f2)
    def f2():
        print('in f2')
    
    @wrapper #f2 = wrapper(f2)
    def f3():
        print('in f3')
    print(l)
  • 相关阅读:
    POJ 3261 Milk Patterns (求可重叠的k次最长重复子串)
    UVaLive 5031 Graph and Queries (Treap)
    Uva 11996 Jewel Magic (Splay)
    HYSBZ
    POJ 3580 SuperMemo (Splay 区间更新、翻转、循环右移,插入,删除,查询)
    HDU 1890 Robotic Sort (Splay 区间翻转)
    【转】ACM中java的使用
    HDU 4267 A Simple Problem with Integers (树状数组)
    POJ 1195 Mobile phones (二维树状数组)
    HDU 4417 Super Mario (树状数组/线段树)
  • 原文地址:https://www.cnblogs.com/Xanderzyl/p/10495014.html
Copyright © 2011-2022 走看看