python装饰器

  1. 文章原始作者:CHZWE转载请标注
引入

有时候我们会需要测量程序运行所花的时间
我们通常会这样子做:

#v1.py
from time import time #从模块time中导入time函数

def a():#定义一个函数模拟需要一定时间运行的程序
    for i in range(5*10**4):#循环,用于拖时间
        for ic in range(5*10**4):#循环,用于拖时间
            pass#啥也不做
start = time()#获取开始时的时间戳
a()#调用一个需要一定运行世间的函数
end = time()#获取结束时的时间戳
se = end - start#计算调用函数共话费时间
print("这个函数共话费了",se,"秒。")

你会看到类似这样的输出:

这个函数共话费了5.098648764秒。

每要测量一段程序就要写一遍,那么我
们要解决这个问题

装饰器

所谓的装饰器,就是把函数作为第一个参数传给装饰器。装饰本身是个函数

#v2.py
from time import time#同样的导入time函数

def a():#同样定义一个需要一定时间的函数
    for i in range(5*10**4):
        for ic in range(5*10**4):
            pass
def tim(func):#定义一个装饰器,一个形参
    start = time()#同样获取运行前时间戳
    func()#执行给予的函数
    end = time()#获取运行后时间戳
    return end -start#返回运行时间
print("这个函数共花费了",tim(a),"秒。")
#函数名带括号是执行它的代码块,
#函数名不带括号可以把它想变量一样
#传递走,比如这里的a就被当做变量传
#递给了tim()

输出依旧一样,不过你使用定义的tim装饰器就可以直接使用tim(函数名),注意参数函数不能加括号!
装饰器行为类似于这样:

函数a --> 装饰器tim() : 把代码作为参数
装饰tim() --> 函数a: 调用

如果你的被装饰函数需要传入参数,那么这样就会出错,但是你可以这样:

--省略重复代码--
def a (s):
    for i in range(9*10**9):#循环用于拖时间
        pass#什么也不做
    return s
def tim(func,*arg,**c):
    --#省略重复代码
    func(*arg,**c)
    --#省略重复代码

但是有些函数你希望每次调用都使用装饰器调用,可是装饰器名称太长,没问题,python3更新出了语法糖(@)

@tim   #@后面跟装饰器
def a(*参数,如果没有也可以省略*):#定义函数紧跟语法糖
    --#省略重复代码

这样你调用a()就会自动调用tim装饰器而不是a()
整个世界都清净了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值