python装饰器常见用法

一、普通装饰器

a.一个输出函数名称和运行时间的装饰器

from datetime import datetime


def run_log(func):
    def deco():
        begin_time = datetime.now()
        res = func()
        finish_time = datetime.now()
        print('函数名称:{}'.format(func.__name__))
        print('总耗时:{}'.format(finish_time - begin_time))
        return res

    return deco

@run_log
def test():
    return '我是函数test的返回值'

print(test())

运行结果:

函数名称:test
总耗时:0:00:00
我是函数test的返回值

b.多个装饰器

from datetime import datetime


def run_time(func):
    def deco():
        begin_time = datetime.now()
        res = func()
        finish_time = datetime.now()
        print('总耗时:{}'.format(finish_time - begin_time))
        return res

    return deco

def func_name(func):
    def deco():
        res = func()
        print('函数名称:{}'.format(func.__name__))
        return res

    return deco

@run_time
@func_name
def test():
    return '我是函数test的返回值'

print(test())

运行结果:

函数名称:test
总耗时:0:00:00
我是函数test的返回值

由此可见,当函数有多个装饰器时,执行顺序为: 最后一个装饰器-->第一个装饰器

二、带参数的装饰器

有的时候需要给装饰器传递参数,让装饰器按需执行

from datetime import datetime


def run_log(para):
    def demo(func):
        def deco(*args, **kwargs):
            if para == '打印函数名称':
                res = func(*args, **kwargs)
                print('函数名称:{}'.format(func.__name__))        
            if para == '打印运行时间':
                begin_time = datetime.now()
                res = func(*args, **kwargs)
                finish_time = datetime.now()
                print('总耗时:{}'.format(finish_time - begin_time))
            
            return res

        return deco

    return demo


@run_log(para='打印函数名称')
def test1():
    return '我是函数test1的返回值'


@run_log(para='打印运行时间')
def test2():
    return '我是函数test2的返回值'


print(test1())
print('我是分割线线线线线线线线线线线线线线线线线线线线线线线线线线线线线线线')
print(test2())

运行结果:

函数名称:test1
我是函数test1的返回值
我是分割线线线线线线线线线线线线线线线线线线线线线线线线线线线线线线线
总耗时:0:00:00
我是函数test2的返回值

三、将函数的参数传递到装饰器上

有的时候可能我们需要将函数的参数传递到装饰器上(装饰器大多是定义用来通用的,所以这种情况使用的场景可能比较少)

a.第一种写法

def run_log(func):
    def deco(*args, **kwargs):
        x, y, res = func(*args, **kwargs)
        print('函数名称:{},函数参数:{},{},函数结果:{}'.format(func.__name__, str(x),              str(y), str(x + y)))
        return x, y, res

    return deco


@run_log
def test(x, y):
    return x, y, x + y


print(test(3, 5))

 运行结果:

函数名称:test,函数参数:3,5,函数结果:8
(3, 5, 8)

实际上就是从test方法的返回值处取得test方法的参数,传递到装饰器中,感觉没啥实际意义啊 !

b.第二种

def run_log(func):
    def deco(x, y):
        res = func(x, y)
        print('函数名称:{},函数参数:{},{},函数结果:{}'.format(func.__name__, str(x), str(y), str(x + y)))
        return res

    return deco


@run_log
def test(x, y):
    return '函数test的返回值:{}'.format(x + y)


print(test(3, 5))

运行结果:

函数名称:test,函数参数:3,5,函数结果:8
函数test的返回值:8

这样写的话,这个装饰器估计只能这个方法用了,感觉这样写也没啥实际意义!

有不对的地方欢迎指正哦!!!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值