当前位置: 首页 > ds >正文

Python打卡训练营day27-函数-装饰器

知识点回顾:
  1. 装饰器的思想:进一步复用
  2. 函数的装饰器写法
  3. 注意内部函数的返回值

作业:

编写一个装饰器 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)    # 调用装饰器函数完成添加装饰器

http://www.xdnf.cn/news/7722.html

相关文章:

  • 数据要素如何重构人力资本升级
  • HTML页面渲染过程
  • 【Linux】第二十三章 控制启动过程
  • 汇川PLC通过Profinet转ModbusTCP网关读取西门子PLC数据案例
  • 【c# 中 == 和jave 的== 区别】
  • idea中,git的cherry-pick怎么用
  • Linux:库与链接
  • 基于Qwen3-7B FP8与基石智算打造高性能本地智能体解决方案
  • 佰力博科技与您浅谈低温介电材料特性及应用分析
  • 基于 STM32 单片机的实验室多参数安全监测系统设计与实现
  • 怎样解决photoshop闪退问题
  • OpenCV图像边缘检测
  • 第12天-Python+Qt5开发实战:10大经典案例与深度解析
  • JVM的面试相关问题
  • C++修炼:map和set的使用
  • TrollStore(巨魔商店)的由来介绍
  • 【typenum】 13 类型级无符号整型(uint.rs)
  • 分频电路设计
  • 中级网络工程师知识点9
  • 目标检测DINO-DETR(2023)详细解读
  • 【Linux】Linux 多线程
  • Java 中 final 与 static 的区别
  • 关于element-ui的table type=“expand“ 嵌套表格展开异常问题解决方案
  • 【C# 自动化测试】Selenium显式等待机制详解
  • Docker网络全景解析:Overlay与Macvlan深度实践,直通Service Mesh集成核心
  • 三轴云台之高精度稳定技术篇
  • 什么是 ERP、MES、PLM,生产制造中如何应用
  • 【C++算法】70.队列+宽搜_N 叉树的层序遍历
  • 软件架构之-论分布式架构设计及其实现
  • Day122 | 灵神 | 二叉树 | 二叉树的层序遍历 二叉树的锯齿状遍历