zoukankan      html  css  js  c++  java
  • Python中的装饰器

    一、装饰器是什么?

    装饰器,顾名思义,就是增强函数或类的功能的一个函数,装饰器本质上是一个Python函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外功能,比如附加一个描述,附加一个执行时间。装饰器的返回值也是一个函数对象。

    二、装饰器的分类

    装饰器分函数装饰器和类装饰器。根据是否带参数分为无参装饰器和带参装饰器。

    三、函数装饰器

    1.函数无参装饰器

    计算两个数的相加和相减的执行时间,代码如下:

    #装饰器模式
    import time
    
    a=int(input('请输入一个整数:'))
    b=int(input('请再输入一个整数:'))
    
    def time_calc(func):
        def wrapper(*args,**kargs):
            start_time=time.time()
            f=func(*args,**kargs)
            exec_time=time.time()-start_time
            print(func.__name__+'函数的执行时间是{}'.format(exec_time))
            return f
        return wrapper
    
    @time_calc  #语法糖
    def add(a,b):
        return a+b
    
    @time_calc
    def sub(a,b):
        return a-b
    
    print(add(a,b))
    print(sub(a,b))
    

      执行结果

     说明:将计算函数的执行时间抽离出来,用装饰器来定义,在每个函数之前使用@语法糖,就可以使用装饰器进行装饰了

    2.函数带参装饰器

    输出函数的函数名,并输入日志级别为INFO,代码如下:

    '''带参装饰器'''
    def logging(level):
        def wrapper(func):
            def inner_wrapper(*args,**kwargs):
                print('[{level}]: enter function {func}()'.format(level=level,func=func.__name__))
                return  func(*args,**kwargs)
            return inner_wrapper
        return wrapper
    
    
    @logging(level='INFO')      #用语法糖@引入装饰器logging
    def say(something):
        #print('say {}!'.format(something))
        return something
    
    #调用say方法
    print(say('hello world!'))
    

      执行结果:

    四、类装饰器

    '''类装饰器'''
    class Decorator(object):
        def __init__(self, f):
            self.f = f
        def __call__(self):
            print("decorator start")
            self.f()
            print("decorator end")
    
    @Decorator
    def func():
        print("func")
    
    #调用方法func
    func()
    

      执行结果:

     说明:__call__()是一个特殊方法,它可将一个类实例变成一个可调用对象:

    p = Decorator(func) # p是类Decorator的一个实例
    p() # 实现了__call__()方法后,p可以被调用

    要使用类装饰器必须实现类中的__call__()方法,就相当于将实例变成了一个方法。

    同一个函数可以使用多个装饰器语法糖@,只要在方法前使用语法糖@进行引入即可

  • 相关阅读:
    CF353D Queue(结论)
    CF1147C Thanos Nim(博弈论、结论推导)
    牛客:CBX and children(平衡树+二分+贪心)
    牛客:Gambling Monster(权值线段树+离散化+离线)
    剑指49.把字符串转换成整数
    剑指48.不用加减乘除做加法
    剑指47.求1+2+3+...+n
    剑指46.孩子们的游戏(圆圈中最后剩下的数字)
    剑指45.扑克牌顺子
    剑指44.翻转单词顺序
  • 原文地址:https://www.cnblogs.com/wx170119/p/14510543.html
Copyright © 2011-2022 走看看