》功能
为一个函数提供一些额外的功能
》两个原则
1,不修改被装饰的函数
2,不修改调用方式
》分步推演
函数一是装饰函数
函数二是功能函数
》一,先实现基本功能
》1,原始的功能
import time
# 装饰器函数
def cont_time(func):
"""统计时间的装饰器"""
start_time = time.time()
func()
end_time = time.time()
# 功能函数
def do_work():
"""有耗时的函数"""
print('do_work开始')
time.sleep(3)
print('do_work结束')
do_work()
运行结果
C:\Users\python_hui\Anaconda3\python.exe G:/test/a/1.py
do_work开始
do_work结束
Process finished with exit code 0
》2,装饰器生效
import time
# 装饰器函数
def cont_time(func):
"""统计时间的装饰器"""
start_time = time.time()
print('计时开始。。。')
func()
end_time = time.time()
print('计时结束,总共耗时{:.2f}秒'.format(end_time - start_time))
# 功能函数
def do_work():
"""有耗时的函数"""
print('do_work开始')
time.sleep(3)
print('do_work结束')
cont_time(do_work)
结果
C:\Users\python_hui\Anaconda3\python.exe G:/test/a/1.py
计时开始。。。
do_work开始
do_work结束
计时结束,总共耗时3.01秒
Process finished with exit code 0
== 1,完成,不修改被装饰的函数 ==
==2,未完成,不修改调用方式 ==
》二,基本功能完成,优化调用方式
基本功能完成
调用方式发生变化
修改调用方式
》
import time
# 装饰器函数
def cont_time(func):
"""统计时间的装饰器"""
def inner():
start_time = time.time()
print('计时开始。。。')
func()
end_time = time.time()
print('计时结束,总共耗时{:.2f}秒'.format(end_time - start_time))
return inner
# 功能函数
def do_work():
"""有耗时的函数"""
print('do_work开始')
time.sleep(3)
print('do_work结束')
do_work = cont_time(do_work) # do_work = inner
do_work() # inner()
结果
C:\Users\python_hui\Anaconda3\python.exe G:/test/a/1.py
计时开始。。。
do_work开始
do_work结束
计时结束,总共耗时3.01秒
Process finished with exit code 0
== 1,完成,不修改被装饰的函数 ==
==2,完成,不修改调用方式 ==
但是,每一次用前都需要有一个重新赋值的的操作,麻烦
》三,语法堂优化
通过语法堂来解决上一步问题
import time
# 装饰器函数
def cont_time(func):
"""统计时间的装饰器"""
def inner():
start_time = time.time()
print('计时开始。。。')
func()
end_time = time.time()
print('计时结束,总共耗时{:.2f}秒'.format(end_time - start_time))
return inner
# 功能函数
@cont_time # 相当于 do_work = cont_time(do_word)
def do_work():
"""有耗时的函数"""
print('do_work开始')
time.sleep(3)
print('do_work结束')
do_work()
结果
C:\Users\python_hui\Anaconda3\python.exe G:/test/a/1.py
计时开始。。。
do_work开始
do_work结束
计时结束,总共耗时3.00秒
Process finished with exit code 0
基本装饰器到此完成
》随堂
import time
# 装饰器函数
def cont_time(func):
"""统计时间的装饰器"""
def inner():
start_time = time.time()
print('计时开始。。。')
func()
end_time = time.time()
print('计时结束,总共耗时{:.2f}秒'.format(end_time - start_time))
return inner
# 功能函数
@cont_time #do_work = count_time(do_work) ---> do_work = inner
def do_work():
"""有耗时的函数"""
print('do_work开始')
time.sleep(3)
print('do_work结束')
@cont_time # do_work2 = cont_time(do_work2)
def do_work2():
print('do_work2开始')
time.sleep(2)
print('do_work2结束')
do_work() # inner()
do_work2()