什么是装饰器?
装饰器本身就是函数,功能就是为其他函数添加新功能
装饰器的两大原则
1:不修改被修饰函数的源代码
2:不修改被修饰函数的调用方式
装饰器所用到的知识点
1:高阶函数
2:函数的嵌套
3:函数的闭包
一:高阶函数
高阶函数就是满足这两个其中一个条件就称为高阶函数(1:函数接收的参数为函数名2:函数的返回值是一个函数名),如下
#满足于函数的参数为函数名
>>> def test():
print("这是一个常规函数")
>>> def test1(func):
print("这是一个高阶函数")
func()
>>> test1(test)
这是一个高阶函数
这是一个常规函数
注:我们知道函数即变量,我们传入一个test函数的内存地址,运行func函数就相当于运行test函数
#满足于函数的返回值为函数名
>>> def test():
print("这是一个常规函数")
>>> def test1(func):
print("这是一个高阶函数")
return func
>>> a=test1(test)
这是一个高阶函数
>>> a()
这是一个常规函数
注:这里返回的func就是test函数的内存地址
二:嵌套函数
>>> def sum():
a=1
def sum1():
nonlocal a
a+=3
sum1()
return a
>>> print(sum())
4
三:函数闭包
函数的闭包其实可以理解为作用域
四:装饰器
1:定义装饰器
例1:写一个简单的装饰器 (统计一个函数的运行时间)
如下函数
def test():
time.sleep(1)
print("hello world")
计算test函数的运行时间,如下
import time
def timmer(func):
def test_time():
start_time=time.time()
func() #这里执行的才是test函数
stop_time=time.time()
print("函数test的运行时间为%s"%(stop_time-start_time))
return test_time
@timmer #等同于test=timmer(test)
def test():
time.sleep(1)
print("hello world")
test() #这里实际执行的是test_time函数
总结:整个过程中,timmer函数中func接收的参数为test函数的内存地址,timmer函数的返回值为test_time函数的内存地址
如果我们需要统计多个函数的运行结果,那么我们就在被修饰函数前加上@timmer功能
例2:计算多个函数的运行时间如下
import time
#装饰器,添加计算时间的功能
def timmer(func):
def test_time():
start_time=time.time()
func()
stop_time=time.time()
print("函数运行时间为%s"%(stop_time-start_time))
return test_time
#函数1
@timmer
def test():
time.sleep(1)
print("这是test函数")
@timmer
def test1():
time.sleep(2)
print("这是test1函数")
test()
test1()
2:为装饰器加上返回值
import time
#装饰器,添加计算时间的功能
def timmer(func):
def test_time():
start_time=time.time()
test_return=func() #这里接收的是被修饰函数的返回值
stop_time=time.time()
print("函数运行时间为%s"%(stop_time-start_time))
return test_return #作为test_time的返回值
return test_time
#函数1
@timmer
def test():
time.sleep(1)
print("这是test函数")
return "这是test的返回值"
@timmer
def test1():
time.sleep(2)
print("这是test1函数")
return "这是test1的返回值"
print(test()) #接收test_time的返回值
print(test1())