开发者学堂课程【Python 入门 2020年版:装饰器的基本使用】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/639/detail/10348
装饰器的基本使用
内容介绍
一、 优化计算代码执行时长
二、 装饰器的结构
三、 装饰器语法的使用
一、优化计算代码执行时长
1、def cal_time(fn):
start = time.time()
fn()
end = time.time()
print('代码运行耗时()秒'.format(end - start))
在一些语言里,如果想计算一段代码的执行时长,这样写就已经是最优化的一个写法了,但是在python里更加高级。
现在想要计算时间,用装饰器就能够做了,直接写demo(),然后写foo(),这样写完之后,它就能够告诉执行了多长时间,这是 Python独有的一个优化。
import time
def demo():
x=0
for i in range(1,100000000):
x += i
print(x)
def foo():
print('hello')
time.sleep(3)
print('world')
demo()
foo()
二、装饰器的结构
1、def cal_time(fn):
def inner():
start= time.time()
fn()
end = time.time()
print('代码耗时',end - start)
return inner
@cal_time
def demo(): I
x=0
for i in range(1,100000000):
x+=i
print(x)
写完这个代码后运行一下,就会得到运行时间。这个代码的结构是函数里面套函数,一定要记住这个结构。
首先要定义一个外部函数,写什么名字都行,然后里面需要一个参数,写完@cal_time后,@cal_time是这个外部函数cal_time的名字。
它叫装饰器的语法糖,就是语法里面内部实现的,讲一下它的原理,一般情况下是不会让自己写装饰器的。
三、装饰器语法的使用
1、def cal_time(fn):
print('我是外部函数,我被调用了!!!')
def inner():
start = time.time()
fn()
end = time.time()
print('代码耗时',end-start)
return inner
@cal_time
def demo(): I
x=0
for i in range(1,100000000):
x+=i
print(x)
第一件事是调用cal_time,运行结果是‘我是外部函数,我被调用了’,也就是只要写了@cal_time,它立刻会调def cal_time这个函数。
第二件事把被装饰的demo函数传给fn,打印一下fn:print(‘fn={}’.format(fn)),运行结果fn是demo函数,这个是装饰语法自己做的事,inner函数没有被调用。
2、第三件事,当再次调用demo函数时,此时demo函数已经不再是上面的demo了,打印一下demo
print('装饰后的demo ={ }'.format(demo))
demo
调dmeo时已经不再是调def demo()这个函数了,它变成了装饰器函数的返回值,也就是inner函数,它俩不是一个东西了。
其实中间有一个过程, fn指向了之前的demo,现在再写demo函数的时候指向的是inner函数,写demo(),这个其实是在执行 inner函数,inner再调一下fn,
fn是以前的demo函数:
x=0
for i in range(1,100000000):
x+=i
print(x)
再调一下时间然后再减一下,这个时候就能够算出demo函数它的执行时间,这个就是基本装饰器语法的一个使用。
这是Python语法糖的内部实现,语法糖就是通过一些语法,会实现一些比较复杂的功能,到底是怎么做的不用管。