zoukankan      html  css  js  c++  java
  • 10-3 函数装饰器

    装饰器形成的过程

      最简单的装饰器----有返回值的----有一个参数----万能参数装饰器的作用:


    不想修改函数的调用方式,但是还想再原来的函数前后添加功能#原则:开放封闭原则
    开放: 对扩展是开放的
    封闭: 对修改是封闭的
    语法糖:@装饰器函数名,@timmer等价于func = timmer(func),其中func()是被装饰函数,timmer()就是装饰器函数

    最简单的装饰器

    import time
    def timmer(f):
        start = time.time()
        f()
        end = time.time()
        print(end-start)
    def func():
        time.sleep(0.1)
        print('nice!')
    timmer(func)
    

    装饰有返回值的装饰器

    import time
    #timmer()就是装饰器函数,只是对一个函数有装饰作用
    def timmer(f):#通过此闭包函数返回一个内部函数名,然后在外部接收,让接收的函数名与外部函数名保持一致即可
        def inner():
            start = time.time()
            ret = f()      #被装饰的函数
            end = time.time()
            print(end-start)
            return ret
        return inner
    
    @timmer     #语法糖---@装饰器函数名,等价于func = timmer(func)
    def func():     #    被装饰的函数
        time.sleep(0.1)
        print('nice!')
        return 'summertrain'
    # func = timmer(func)
    result = func()
    print(result)
    

    有一个参数

    import time
    #timmer()就是装饰器函数
    def timmer(f):#通过此闭包函数返回一个内部函数名,然后在外部接收,让接收的函数名与外部函数名保持一致即可
        def inner(a):
            start = time.time()
            ret = f(a)      #被装饰的函数
            end = time.time()
            print(end-start)
            return ret
        return inner
    
    @timmer     #语法糖---@装饰器函数名,等价于func = timmer(func)
    def func(a):     #    被装饰的函数
        time.sleep(0.1)
        print('nice!',a)
        return 'summertrain'
    # func = timmer(func)
    result = func(1)
    print(result)
    

    万能参数

    #装饰带多个参数,且包括按照位置以及参数传参的装饰器
    import time
    #timmer()就是装饰器函数
    def timmer(f):#通过此闭包函数返回一个内部函数名,然后在外部接收,让接收的函数名与外部函数名保持一致即可
        def inner(*args,**kwargs):
            start = time.time()
            ret = f(*args,**kwargs)      #被装饰的函数
            end = time.time()
            print(end-start)
            return ret
        return inner
    
    @timmer     #语法糖---@装饰器函数名,等价于func = timmer(func)
    def func(a,b):     #    被装饰的函数
        time.sleep(0.1)
        print('nice!',a,b)
        return 'summertrain'
    # func = timmer(func)
    result = func(1,b=22)
    print(result)
    

    装饰器的固定模式

    #例子
    import time
    def wrapper(f):     #   f是被装饰的函数
        def inner(*args,**kwargs):
            '''在被装饰函数之前要做的事儿'''
            ret = f(*args,**kwargs)
            '''在被装饰函数之前要后的事儿'''
            return ret
        return inner
    
    @wrapper
    def func(a,b):
        time.sleep(0.1)
        print('nice!',a,b)
        return 'summertrain'
    
    
    
    #减缩版
    def wapper(func):
        def inner(*args,**kwargs):
            ret = func(*args,**kwargs)
            return ret
        return inner
    @wapper
    #qqxing = wapper(qqxing)
    def qqxing():
        print(1111)
    result = qqxing()
    

    装饰器进阶

    def wahaha():
        print('李白')
    print(wahaha,type(wahaha))  #   结果:<function wahaha at 0x00588B70> <class 'function'>
    #查看字符串格式的函数名
    print(wahaha.__name__,type(wahaha.__name__))    #   结果:wahaha <class 'str'>
    
    from functools import wraps
    def wrapper(f):#f=holiday
        @wraps(f)
        def inner(*args,**kwargs):
            print('before')
            ret = f(*args,**kwargs)
            print('later')
            return ret
        return inner
    @wrapper
    def holiday(day):
        '''放假通知'''
        print('国庆%s天假期'%day)
        return '开心'
    print(holiday.__doc__)
    print(holiday.__name__)
    result = holiday(7)
    print(result)
    

    执行结果:

    放假通知
    holiday
    before
    国庆7天假期
    later
    开心

  • 相关阅读:
    求算个十百输出
    求算反弹高度
    九九乘法表
    等腰三角形字母
    动态数码管
    静态数码管
    出错的程序操作
    EPLAN
    robotstudio smart组件解释
    eclipse插件安装方法
  • 原文地址:https://www.cnblogs.com/Cheryol/p/9740436.html
Copyright © 2011-2022 走看看