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

【Python】--装饰器

装饰器(Decorator)本质上是一个返回函数的函数
主要作用是:在不修改原函数代码的前提下,给函数增加额外的功能
比如:增加业务,日志记录、权限验证、执行时间统计、缓存等场景

@my_decorator
def func():pass# 等价于:
def func():pass
func = my_decorator(func)

1、闭包

def outer(x):def inner(y):return x + yreturn inneradd5 = outer(5)
print(add5(3))  # 输出 8

闭包(Closure)指一个函数定义在另一个函数内部,并且这个内部函数引用了外部函数的变量。即使外部函数已经返回了,内部函数依然**“记住”**并可以访问这些变量
就如这里的x

功能
  • 保存函数执行时的“上下文”;

  • 用于延迟计算或构造回调函数;

  • 实现数据隐藏(类似于面向对象中的私有变量);

  • 替代某些简单场景中的类。

2、装饰器基础

装饰器本质上就是闭包的一种应用,用于在不修改函数源代码的情况下增强函数功能


def decorator(func):def wrapper(*args, **kwargs):start_time = time.time()result = func(*args, **kwargs)stop_time = time.time()print(f'running_time is {stop_time - start_time}')return resultreturn wrapper@decorator   # double=decorator(double)
def double(x):time.sleep(1) # 模拟耗时return x*2
double(10)

这里在原本的基础上增加了(统计函数执行时间)功能

3、保留函数元数据

使用装饰器后
装饰器会覆盖原函数的元数据
在这里插入图片描述
使用functools.wraps装饰内层函数可保留原函数元数据

import functools
import time# 装饰器outer
def decorator(func):@functools.wraps(func)def wrapper(*args, **kwargs):'''这里是wrapper的注释'''start_time = time.time()result = func(*args, **kwargs)stop_time = time.time()print(f'running_time is {stop_time - start_time}')return resultreturn wrapper
@decorator   # double=decorator(double)
def double(x):'''这里是doubled的注释'''time.sleep(1) # 模拟耗时return x*2
double(10)
print(double.__name__)
print(double.__doc__)

在这里插入图片描述

4、带参数的装饰器

需要使用三层函数来实现。最外层函数接收装饰器参数,中间层函数接收原函数,最内层函数完成对原函数的调用以及附加功能。

def timer(time_consume):def decorator(func):@functools.wraps(func)def wrapper(*args, **kwargs):start_time = time.time()result = func(*args, **kwargs)stop_time = time.time()if (stop_time - start_time>time_consume):print(f'running is {stop_time - start_time}')print(f'{func.__name__} is longer')return resultreturn wrapperreturn decorator
@timer(0.8)   # double=timer(0.8)(double)
def double(x):time.sleep(1) # 模拟耗时return x*2
double(10)
http://www.xdnf.cn/news/4231.html

相关文章:

  • Coding Practice,48天强训(30)
  • 2. H264编码
  • 垂直领域知识图谱构建与大模型融合技术方案
  • 达梦DM数据库安装步骤
  • 普通IT的股票交易成长史--20250506午复盘
  • Leetcode - 周赛448
  • 分割回文串例题-区分组合回溯与最优动态规划
  • 主数据 × 知识图谱:打造企业认知智能的核心基础设施
  • C++GO语言微服务项目之 go语言基础语法
  • pcl平面投影
  • 解锁科研文献检索密码:多工具协同攻略
  • 代码规范总结
  • 推导部分和-图论+dfs+连通块
  • 【MongoDB篇】MongoDB的聚合框架!
  • 【区块链】Uniswap详细介绍
  • HTML07:表格标签
  • 多线程2-多线程编程
  • 【网络原理】IP协议
  • Git 使用的全流程以及SourceTree工具的使用操作和忽略文件的配置
  • BERT预训练
  • ArrayList 和 LinkedList 的区别
  • 「Mac畅玩AIGC与多模态21」开发篇17 - 多字段判断与多路径分支工作流示例
  • 《Python星球日记》 第36天:线性代数基础
  • 静态库和动态库的区别
  • 【强化学习】什么是强化学习?2025
  • tp8+swoole搭建
  • 5.2创新架构
  • Linux/AndroidOS中进程间的通信线程间的同步 - 虚拟内存操作
  • 20250506让NanoPi NEO core开发板使用Ubuntu core16.04系统的TF卡启动
  • 德尔菲法和层次分析法是什么