2.6 装饰器

文章介绍了Python中装饰器的三种使用方式:1)直接调用函数;2)返回包装函数,需要手动调用;3)带参数的装饰器,展示了如何在装饰器中传递参数并影响被装饰的函数。这些例子主要用于测量和打印函数的执行时间。
摘要由CSDN通过智能技术生成

1、普通用法

import time


def timer(fun):
    start = time.time()
    fun()
    end = time.time()
    print(f'function:{fun.__name__},duration:', end=f'{end - start}\n')


@timer
def a():
    pass


@timer
def b():
    time.sleep(3)
    pass

装饰器timer中直接调用了fun(),所以上述代码直接运行即可

等同于

import time


def timer(fun):
    start = time.time()
    fun()
    end = time.time()
    print(f'function:{fun.__name__},duration:', end=f'{end - start}\n')


def a():
    pass


timer(a)

2、返回函数

import time


def timer(fun):
    def wrapper(*args, **kwargs):
        start = time.time()
        fun()
        end = time.time()
        print(f'function:{fun.__name__},duration:', end=f'{end - start}\n')
    return wrapper


@timer
def a():
    pass


@timer
def b():
    time.sleep(3)
    pass


a()
b()
import time


def timer(fun):
    def wrapper(*args, **kwargs):
        start = time.time()
        fun(*args)
        end = time.time()
        print(f'function:{fun.__name__},duration:', end=f'{end - start}\n')
    return wrapper


@timer
def a(*args):
    print(args)
    pass


@timer
def b(*args):
    print(args)
    time.sleep(3)
    pass


a(1)
b(2)

装饰器返回了一个函数,所以需要手工调用

上述代码等同于

import time


def timer(fun):
    def wrapper(*args, **kwargs):
        start = time.time()
        fun(*args)
        end = time.time()
        print(f'function:{fun.__name__},duration:', end=f'{end - start}\n')

    return wrapper


def a(*args):
    print(args)
    pass


c = timer(a)
# c是返回的wrapper方法
c('1', '2')
# 当a()被装饰器装饰时,主动调用a()时,其实已经被替换为装饰器返回的方法

3、有参数装饰器 

import time


def timer(level):
    def decorator(fun):
        def wrapper(*args, **kwargs):
            start = time.time()
            fun(level)
            end = time.time()
            print(f'function:{fun.__name__},duration:', end=f'{end - start}\n')
        return wrapper
    return decorator


@timer('1')
def a(*args):
    print(args)
    pass


@timer('2')
def b(*args):
    print(args)
    time.sleep(3)
    pass


a()
b()

 

import time


def timer(level):
    def decorator(fun):
        def wrapper(*args, **kwargs):
            return fun(level, *args, **kwargs)

        return wrapper

    return decorator


@timer('level')
def a(*args):
    print(args)
    pass


@timer('level')
def b(*args):
    print(args)
    time.sleep(3)
    pass


a(1, 2, 3, 4, {"a": 1})
b(2, 3, 4, 5)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值