1.装饰器作用
- 用来装饰其他函数,也就为其他函数添加特定的功能
- 装饰器 = 高阶函数 + 嵌套函数
2.装饰器遵循的两个原则
- 不改变被装饰函数的源码
- 不改变被装饰函数的调用方式
3.编写装饰器的公式步骤
-
定义一个可以接受函数名作为参数的高阶函数
-
在高阶函数中定义一个嵌套函数
-
在嵌套函数中:
- 封装想要添加的功能代码
- 调用作为参数传递的函数(名)
- 返回嵌套函数
4.装饰器使用方法
- @装饰器(语法糖)
5.装饰器的代码实现
5.1.被装饰函数 带有参数或不带参数
import time
def timer(func):
def gf(*args,**kwargs):
star_time = time.time()
func(*args,**kwargs)
end_time = time.time()
print(f"函数{func.__name__}运行时长为{end_time - star_time}")
return gf
@timer
def foo(name,age):
time.sleep(2)
print(print(f"my name is {name} ,my age is {age}"))
foo(name,age)
5.2.装饰器本身带有参数
def timer(timer_type):
"""
装饰器生成器,用于计算被装饰函数的执行时间。
参数:
timer_type -- str,装饰器的类型,用于标识装饰器本身。
返回:
一个装饰器函数,用于包裹目标函数,计算目标函数的执行时间。
"""
print(f"装饰器类型为:{timer_type}")
def outer(func):
"""
装饰器函数,用于包裹目标函数,计算其执行时间。
参数:
func -- function,目标函数,即需要计算执行时间的函数。
返回:
一个函数,用于计算目标函数的执行时间。
"""
def inner(*args, **kwargs):
"""
目标函数的装饰器,计算目标函数的执行时间。
参数:
*args -- 目标函数的位置参数。
**kwargs -- 目标函数的关键字参数。
返回:
无返回值,直接打印目标函数的执行时间。
"""
start_time = time.time() # 记录函数开始执行的时间
func(*args, **kwargs) # 执行目标函数
end_time = time.time() # 记录函数执行结束的时间
print(f"函数{func.__name__}执行时间为:{end_time - start_time}") # 计算并打印函数执行时间
return inner # 返回计算执行时间的函数
return outer # 返回装饰器函数
@timer(timer_type="计算函数运行时长")
def foo(name,age):
time.sleep(2)
print(print(f"my name is {name} ,my age is {age}"))
foo(name,age)
5.3.被装饰函数有返回值
def timer(timer_type):
print(f"装饰器类型为:{timer_type}")
def outer(func):
def inner(*args, **kwargs):
start_time = time.time()
result = func(*args, **kwargs) # 执行目标函数 并记录返回值
end_time = time.time()
print(f"函数{func.__name__}执行时间为:{end_time - start_time}")
return result # 返回执行目标函数 返回值
return inner
return outer
@timer(timer_type="计算函数运行时长")
def foo(name,age):
time.sleep(2)
print(print(f"my name is {name} ,my age is {age}"))
return "被装饰函数返回的值"
print(foo(name,age))