【偶然习得】python中的装饰器

装饰器作用——在不改变原函数的代码和调用方式的情况下,给函数添加功能

如下,有一个函数func()

def func():
	print("执行开始")
	print("执行结束")

现在,我们需要测试该函数执行所耗费的时间
如下

import time
def func():
	print("执行开始")
	print("执行结束")

starttime = time.time()
func()
endtime = time.time()
print("函数执行耗时:",endtime - starttime)

但在写项目的时候,我们不可能在每个函数执行的前后都加上上面的语句,所以我们需要将此功能写到函数的内部,让它执行一次就输出执行耗费的时间,如下:

import time
def func():
	starttime = time.time()
	print("执行开始")
	print("执行结束")
	endtime = time.time()
	print("函数执行耗时:",endtime - starttime)

func()

现在,我们为这个函数加上了计时功能,但是当我们需要将很多函数都加上这个功能时,直接在函数体中写代码就会很麻烦了
这个时候,我们就会想到,在每个函数体中都加上计时功能就会使代码的重复率变得很高,这个时候,就应该用函数来进行代码的复用

import time
def func():
	print("执行开始")
	print("执行结束")

def test(func):
	starttime = time.time()
	func()
	endtime = time.time()
	print("函数执行耗时:",endtime - starttime)

test(func)

上面虽然解决了代码重复的问题,但是这样想要执行func()函数并且输出耗时,就必须使用test()函数,这样就改变了函数的调用方式。想要不改变函数的调用方式,又要批量的给函数增加功能,就需要进行如下的改进了

import time
def func():
	print("执行开始")
	print("执行结束")

def test(func):
	def f():	
		starttime = time.time()
		func()
		endtime = time.time()
		print("函数执行耗时:",endtime - starttime)
	return f

func = test(func)
func()

如上,将函数传入test中,test内的f函数就比func函数多了一个计时功能,然后将f函数返回,由func来接收,这样,就实现了功能的添加,只需为每个函数添加类似func = test(func)的语句,就可以实现添加功能
python中,有专门的的语法来表示func = test(func),即在函数的定义前面添加@test,如下

import time
def test(func):
	def f():	
		starttime = time.time()
		func()
		endtime = time.time()
		print("函数执行耗时:",endtime - starttime)
	return f

@test	#相当于func = test(func)
def func():
	print("执行开始")
	print("执行结束")
	
func()

此时@test就成了一个装饰器了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CI_FAN

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值