我们到了新的阶段了,也是逃不过的一劫,装饰器,有的兄弟们估计听说过,这可是一个神奇的东西,
在认识它之前我们先来回顾一下闭包
def func1():
name = "alex"
def func2():
print(name)
# 闭包
func2()
func1()
这就是闭包,那刚刚说一个很神奇的东西,为什么又说闭包了呢? 机智的铁子们已经猜到,装饰器和闭包是有点关系的,是滴没错.
那什么是装饰器呢?装饰器是干什么的呢?
现在你在公司,领导让你写一个函数,来测试另一个函数的执行效率,你怎么做?
先引入时间概念。
import time
def func():
print('嘻嘻更健康')
import time
start_time = time.time()
time.sleep(0.1)
func()
end_time = time.time()
print('----> 执行效率%s'%(end_time - start_time))
上面你已经写完了,但是你应该放在函数中,这样减少重复代码,可读性好,ok继续做。
def func():
print('嘻嘻更健康')
def timmer(f):
start_time = time.time()
time.sleep(0.1)
f()
end_time = time.time()
print('----> 执行效率%s'%(end_time - start_time))
好你又写完了,但是执行之前的函数只是func(),而你写玩了这个之后,还得加一步timmer(func),如果要是领导让你测试500个函数的执行效率呢?好,你又进一步改,如下
func()
f1 = func # func
func = timmer # timmer
func(f1)
将他的执行结果改了一下,这样看似func(f1)与原来的调用差不多,但是加了好几步,而且添加了f1参数。。。
现在你请教了我,我说来,写个装饰器就能解决。
def timmer(f): #小花
def inner(): # 小红
start_time = time.time()
time.sleep(0.1)
f()
end_time = time.time()
print('----> 执行效率%s' % (end_time - start_time))
return inner
def func(): #小刚
print("is func")
func = timmer(func) # inner
func() # inner()
这样,就写好了,这是最简单的装饰器,装饰任何函数,只需要加一句func = timmer(func)
肯定有人在想,这一堆鬼东西是什么啊,慢 别急往下看.兄弟我说的是往下看文章,不是看你下边
func函数是小刚,timmer函数是小花,inner函数是小红.小花和小红是非常好的闺蜜
小刚对小红一直暗生情愫,直到有一天憋不住了想和小红说但是,又想知道小红对他什么看法所以小刚找到了小花
然后把他的想法和小花说了,小花然后问小红你觉得小刚怎么样.小红说很好啊,我还挺喜欢他的,然后小花就把小红的话告诉了小刚,小刚听了这句话很是激动,然后就直接去找小红和小红进行表白了.
#简单的装饰器
def func():
print('嘻嘻更健康')
def timmer(f):
def inner():
start_time = time.time()
time.sleep(0.1)
f()
end_time = time.time()
print('----> 执行效率%s' % (end_time - start_time))
return inner
func = timmer(func) # inner
func() # inner()
但是Python认为你这个还是不简单,所以Python给你提供了一个更见的方式就是语法糖。
#语法糖 @
def timmer(f):
def inner():
start_time = time.time()
time.sleep(0.1)
f()
end_time = time.time()
print('----> 执行效率%s' % (end_time - start_time))
return inner
@timmer # func = timmer(func)
语法糖的拆解
@装饰器函数 == 重新定义被装饰函数=装饰器函数(被装饰函数)
def func():
print('嘻嘻更健康')
func() # inner()