BoringBlue
文章14
标签17
分类6
python之装饰器的使用

python之装饰器的使用

常见使用场景

装饰器的常见使用场景:

  1. 打印日志
  2. 计时

场景1.打印日志

创建装饰函数

    # 创建装饰函数
    def logger(func):
        def wrapper(*args, **kw): 
            print('我准备开始计算:{}函数了:'.format(func.__name__))

            # 真正执行的是这行。 
            func(*args, **kw)

            print('啊哈,我计算完啦。给自己加个鸡腿!!')
        return wrapper

使用

创建业务函数,这里是计算两数之和。
创建好后,在创建方法上方用@符号进行装饰。
然后运行业务函数,查看打印信息。

    @logger
    def add(x, y):
        print('{} + {}={'.format(x,y,x+y))

    # 运行
    add(2,3)

场景2.计时器

创建装饰函数

    # 创建装饰函数
    def timer(func):
        def wrapper(*args, **kw): 
            t1 = time.time()

            # 真正执行的是这行。 
            func(*args, **kw)
            t2 = time.time()

            # 计算时长
            cost_time = t2 - t1

            print("消耗时长:{}秒".format(cost_time))
        return wrapper

使用

    @timer
    def do_sleep(sleep_time):
        time.sleep(sleep_time)

    # 运行
    do_sleep(5)

进阶用法

1.带参数的函数装饰器

创建装饰器函数

    def say_hello(contry):
        def wrapper(func):
            def deco(*args, **kwargs):
                if contry == "china":
                    print("你好!")
                elif contry == "america":
                    print('hello.') 
                else:
                    return

                #真正执行函数的地方 
                func(*args, **kwargs)
            return deco 
        returt wrapper

使用

    @say_hello("china")
    def chinese():
        print("我来自中国。")
        
    @say_hello("america")
    def american():
        print("I am from America.")

    # 运行
    chinese()
    american()

2.不带参数的类装饰器

3.带参数的类装饰器

×