zoukankan      html  css  js  c++  java
  • python 装饰函数

    装饰器的作用 —— 不想修改函数的调用方式 但是还想在原来的函数前后添加功能
    原则: 开放封闭原则  
    开放 : 对扩展是开放的
    封闭 : 对修改是封闭的

    # timmer就是一个装饰器函数,只是对一个函数 有一些装饰作用
     1 import time
     2 def timmer(f):    #装饰器函数
     3     def inner():
     4         start = time.time()
     5         f()       #被装饰的函数
     6         end = time.time()
     7         print(end - start)
     8     return inner
     9 
    10 @timmer         #语法糖 @装饰器函数名
    11 def func():     #被装饰的函数
    12     time.sleep(0.01)
    13     print('老板好同事好大家好')
    14     return '新年好'
    15  #inner
    16 #func = timmer(func)
    17 ret = func()   #inner()
    18 print(ret)
    装饰带参数函数的装饰器
    def timmer(f):    #装饰器函数
        def inner(*args,**kwargs):
            #(1,2) /(1)
            start = time.time()
            ret = f(*args,**kwargs)  #f(1,2)       #被装饰的函数
            end = time.time()
            print(end - start)
            return ret
        return inner
    
    @timmer         #语法糖 @装饰器函数名
    def func(a,b):     #被装饰的函数
        time.sleep(0.01)
        print('老板好同事好大家好',a,b)
        return '新年好'
    装饰器的固定模式
    def wrapper(f):    #装饰器函数,f是被装饰的函数
        def inner(*args,**kwargs):
            '''在被装饰函数之前要做的事'''
            ret = f(*args,**kwargs)    #被装饰的函数
            '''在被装饰函数之后要做的事'''
            return ret
        return inner
    
    @wrapper         #语法糖 @装饰器函数名
    def func(a,b):     #被装饰的函数
        time.sleep(0.01)
        print('老板好同事好大家好',a,b)
        return '新年好'  
    装饰器进阶 
    带参数的装饰器
    #500个函数统一
    import time FLAG=False def time_out(FLAGE): def timmer(f): #装饰器函数 def inner(*args,**kwargs): #(1,2) /(1) if FLAGE: start = time.time() ret = f(*args,**kwargs) #f(1,2) #被装饰的函数 end = time.time() print(end - start) return ret else: ret = f(*args, **kwargs) # f(1,2) return ret return inner return timmer @time_out(FLAG) #语法糖 @装饰器函数名 def func(a,b): #被装饰的函数 time.sleep(0.01) print('老板好同事好大家好',a,b) return '新年好' func(2,3)
    
    

     多个装饰器装饰一个函数

     

    #多个装饰器装饰一个函数
    def wrapper1(func):
        def inner1():
            print('wrapper1 ,before func')
            ret = func()
            print('wrapper1 ,after func')
            return ret
        return inner1
    def wrapper2(func):
        def inner2():
            print('wrapper2 ,before func')
            ret = func()
            print('wrapper2 ,after func')
            return ret
        return inner2
    def wrapper3(func):
        def inner3():
            print('wrapper3 ,before func')
            ret = func()
            print('wrapper3 ,after func')
            return ret
        return inner3
    
    @wrapper3
    @wrapper2
    @wrapper1
    def f():
        print('in f')
        return '哈哈哈'
    
    print(f())
    ###
    wrapper3 ,before func
    wrapper2 ,before func
    wrapper1 ,before func
    in f
    wrapper1 ,after func
    wrapper2 ,after func
    wrapper3 ,after func
    哈哈哈
    

      wraps的用法

    from functools import wraps
    def wrapper(func):  #func = holiday
        @wraps(func)
        def inner(*args,**kwargs):
            print('在被装饰的函数执行之前做的事')
            ret = func(*args,**kwargs)
            print('在被装饰的函数执行之后做的事')
            return ret
        return inner
    
    @wrapper   #holiday = wrapper(holiday)
    def holiday(day):
        '''这是一个放假通知'''
        print('全体放假%s天'%day)
        return '好开心'
    
    print(holiday.__name__)
    print(holiday.__doc__)
    ret = holiday(3)   #inner
    print(ret)
    

      

     
     



  • 相关阅读:
    基础笔记8(二)(容器-引用类型的排序)
    OO的五大原则是指SRP、OCP、LSP、DIP、ISP。
    基础笔记9(泛型)
    insert statements will fail to restore data from temporary table. you must correct statements preceded by a warning comment in spcript.
    sqlserver 官方文档
    sqlserver 时间格式转换汇总:日、周、月、年、小时、分钟、秒 等。
    sqlserver查询一天中时间最大的那行数据
    PowerDesigner设计表时显示注释列Comment(转载)
    无法访问网页:多是域名或ip地址错误。
    远程报错,本地完全没问题,多是配置文件错误!
  • 原文地址:https://www.cnblogs.com/olivia2018/p/8137505.html
Copyright © 2011-2022 走看看