装饰器:通过@Decorator_name来装饰某个函数,执行该函数的时候会对该函数进行的对应的修饰。
装饰器的写法与闭包类似:内部函数要返回给外部函数,但是不同的是,装饰器内部函数调用的是函数,闭包是变量。
通过以下例子来帮助理解吧~
例子需求:执行a函数运行的时长等信息
未使用装饰器前:
import time
def i_can_sleep():
time.sleep(3)
start_time = time.time() # 开始执行的时间
stop_time = time.time() # 结束的时间
i_can_sleep()
print("运行了 %s 秒" %(stop.time - start.time))
以上的实现还是比较繁琐的,如果其它函数也有同样的修饰需求,那可能增加很多重复的代码,复用性不高。以下是使用装饰器的情况。
import time
def timmer():
def wrapper():
start_time = time.time()
func()
stop_time = time.time()
print("运行了 %s 秒" %(stop.time - start.time))
# 使用装饰器
@timmer
def i_can_sleep():
time.sleep(3)
i_can_sleep()
以上,使用@timmer装饰器之后运行i_can_sleep()会把该函数传入装饰器,对该函数进行修饰,执行的过程如下
num = timmer(i_can_sleep()) # 把i_can_sleep()传入ti mmer(),创建一个对象num
num() # 执行函数
带参数的装饰器?
为了装饰器的复用性以及能满足需求,装饰器需要根据情况带参数
装饰器内部函数带参数
def tips(func):
# 内部函数带参
def nei(a,b):
print('start')
func(a,b)
print('stop')
return nei
@tips
def add(a,b):
print(a+b)
@tips
def sub(a,b):
print(a-b)
print(add(4,5))
print(sub(10,4))
执行结果如下:
start
9
stop
None
start
6
stop
None
装饰器带参数
# 装饰器外部带一个参数argv
def new_tips(argv):
def tips(func):
# 内部函数带参
def nei(a, b):
# 根据需要可以打印执行函数的函数名,通过func.__name__获取
print('start run %s ,函数名是%s ' %(argv,func.__name__))
func(a, b)
print('stop')
return nei
return tips
@new_tips('add_numbers')
def add(a,b):
print(a+b)
@new_tips('sub_numbers')
def sub(a,b):
print(a-b)
print(add(4,5))
print(sub(10,4))
执行结果如下:
start run add_numbers ,函数名是add
9
stop
None
start run sub_numbers ,函数名是sub
6
stop
None
装饰器的特点
- 调用函数不用重复编写的修饰代码
- 装饰器代码需要复用可加上参数
6961

被折叠的 条评论
为什么被折叠?



