装饰器
什么是装饰器
装饰器可以给现有的模块增加一些新的功能,同时,不需要对原模块做出任何修改。
装饰器的使用符合了面向对象编程的开放封闭原则。
开放封闭原则主要体现在两个方面:
- 对扩展开放,意味着有新的需求或变化时,可以对现有代码进行扩展,以适应新的情况。
- 对修改封闭,意味着修改时不应修改代码来实现变化。
装饰器的实现
首先,我们要知道,在Python中,函数也可以作为参数传递:
def run(func):
print('in run function')
func()
def function():
print('hello world')
run(function)
"""
in run function
hello world
"""
知道这一点后,我们就可以写一个专门用来记录函数运行时间的函数。
from time import time, sleep
def count_time(func):
print('start')
start = time()
func()
end = time()
print('time: ', str(end - start) + 's')
def function():
print('hello world')
sleep(2)
print('good bye world')
count_time(function)
"""
start
hello world
good bye world
time: 2.0017452239990234s
"""
换一种写法:
from time import time, sleep
def count_time(func):
def wrapper():
print('start')
start = time()
func()
end = time()
print('time: ', str(end - start) + 's')
return wrapper
def function():
print('hello world')
sleep(2)
print('good bye world')
new_function = count_time(function)
new_function()
"""
start
hello world
good bye world
time: 2.0072693824768066s
"""
使用语法糖,也就是装饰器
from time import time, sleep
def count_time(func):
def wrapper():
print('start')
start = time()
func()
end = time()
print('time: ', str(end - start) + 's')
return wrapper
@count_time
def function():
print('hello world')
sleep(2)
print('good bye world')
function()
"""
start
hello world
good bye world
time: 2.004805564880371s
"""