Python打卡训练营day27-函数-装饰器
知识点回顾:
- 装饰器的思想:进一步复用
- 函数的装饰器写法
- 注意内部函数的返回值
作业:
编写一个装饰器 logger,在函数执行前后打印日志信息(如函数名、参数、返回值)
装饰器实际上是一个增强函数,它接受原函数为参数,并返回一个新函数,这个新函数在不改变原函数参数与返回值的同时,可以进行一些额外操作,如日志、计时、权限校验等。
定义装饰器
# 引入获取函数信息的工具库
import functoolsdef decorator(func): # 这里的func就是要添加装饰器的函数@functools.wraps(func) # 使用工具保留原函数信息def wrapper(*args,**kwargs): # 创建新函数wrapperprint(f"[INFO] 执行函数: {func.__name__}, 参数: args={args}, kwargs={kwargs}")# 原函数执行前,打印日志result = func(*args,**kwargs) # 在新函数中执行原函数,并保存原函数的返回值到resultprint(f"[INFO] 函数 {func.__name__} 执行完毕,返回值: {result}")# 原函数执行后,输出返回值return resultreturn wrapper
定义好装饰器后,给函数添加装饰器时,在函数定义前加上@装饰器名 即可
这里在day26的计算圆面积的函数前添加装饰器
import math@decorator
def calculate_circle_area(r):if type(r) !=int and type(r != float):raise ValueError('请输入数值')elif r < 0:raise ValueError('半径不能为负数') else:return math.pi *r*rlist = [5,1,-1,'a']for num in list:try:a = calculate_circle_area(num) except ValueError as e:print(e)else:print(f'{a:.2f}')
[INFO] 执行函数: calculate_circle_area, 参数: args=(5,), kwargs={}
[INFO] 函数 calculate_circle_area 执行完毕,返回值: 78.53981633974483 78.54
[INFO] 执行函数: calculate_circle_area, 参数: args=(1,), kwargs={}
[INFO] 函数 calculate_circle_area 执行完毕,返回值: 3.141592653589793 3.14
[INFO] 执行函数: calculate_circle_area, 参数: args=(-1,), kwargs={} 半径不能为负数
[INFO] 执行函数: calculate_circle_area, 参数: args=('a',), kwargs={} 请输入数值
为函数添加装饰器有多中方法,其中用的较多的是直接@装饰器名,在之后定义函数
@decorator
# 在这里定义函数
def add(a,b):return a+b
也可以直接把装饰器当做函数调用
def add(a,b):return a+badd = decorator(add) # 调用装饰器函数完成添加装饰器