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

【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)

相关文章:

  • FoMo 数据集是一个专注于机器人在季节性积雪变化环境中的导航数据集,记录了不同季节(无雪、浅雪、深雪)下的传感器数据和轨迹信息。
  • Python生活手册-Numpy多维数组构建:从快递分拣到智能家居的数据变形术
  • 美妆集合体验馆的「AI 焕新」:从人工到智能管理的蜕变
  • [蓝桥杯 2025 省 B] 水质检测(暴力 )
  • [前端]Javascript获取元素宽度
  • 【中间件】brpc_基础_栈管理
  • android-ndk开发(8): ndk 和 clang 版本对照表
  • 遨游科普:2025年,三防平板有多智能?
  • 【coze】意图识别(售前售后问题、搜索引擎去广告)
  • DVWA靶场保姆级通关教程--03CSRF跨站请求伪造
  • 学习groovy知识点总结
  • Qt国际化实战--精通Qt Linguist工具链
  • Spring Boot Starter简介-笔记
  • Android 开发中JDK 的使用和配置详解
  • 通过 ModernBERT 实现零样本分类的性能提升
  • DeepSeek部署实战指南:从环境搭建到企业级优化
  • 【Pandas】pandas DataFrame agg
  • 《数据分析与可视化》(清华)ch-6 作业 三、绘图题
  • 前端面试每日三题 - Day 26
  • 如何用爬虫获得按关键字搜索淘宝商品
  • 公元1057年:千年龙虎榜到底有多厉害?
  • 观察|22项达全球最优,世行为上海营商环境“盖章”
  • 李云泽:再批复600亿元,进一步扩大保险资金长期投资试点范围
  • 金融监管总局将推出8项增量政策:涉房地产金融、险资入市、稳外贸等
  • 潘功胜:将创设科技创新债券风险分担工具
  • 潘功胜:降准0.5个百分点,降低政策利率0.1个百分点