Python装饰器使用方法详解

news2025/1/13 6:04:50

文章目录

  • 1 装饰器背景知识
    • 1.1 基本概念
    • 1.2 应用场景
  • 2 简单的装饰器代码
  • 3 使用装饰器记录函数执行次数
  • 4 带参数的装饰器
  • 5 装饰器处理有返回值的函数

1 装饰器背景知识

1.1 基本概念

装饰器(Decorator)是 Python 中一种函数或类,用来修饰其他函数或类。装饰器可以改变被装饰函数的行为,或者在调用被装饰函数之前和之后增加额外的操作。装饰器的语法是使用 @ 语法符,在函数定义之前增加装饰器函数的名称。

@decorator_func
def my_func():
    pass

1.2 应用场景

  1. 代码重用:装饰器可以让我们在不更改原函数代码的情况下,为其添加额外的功能。

  2. 日志记录:装饰器可以记录函数的调用日志,帮助我们追踪程序的运行情况。

  3. 权限控制:装饰器可以用来实现函数级别的权限控制,只允许特定的用户访问特定的函数。

  4. 缓存:装饰器可以用来缓存函数的返回值,避免重复计算。

  5. 类型检查:装饰器可以用来在函数调用前检查参数的类型是否符合要求。

  6. 装饰器可以让你在函数或类的定义中添加额外的逻辑,而不更改它们的实现。

2 简单的装饰器代码

def decorator_func(func):
    def wrapper():
        print("Before calling the function")
        func()
        print("After calling the function")
    return wrapper

@decorator_func
def my_func():
    print("Inside the function")

my_func()
# Output: Before calling the function
#         Inside the function
#         After calling the function

上面展示了最简单的装饰器示例代码。在代码中,我们建立了一个名为decorator_func的装饰器和一个名为my_func函数。

  1. 装饰器外部的return必须为装饰器的内部函数,不含括号。通过代码结构可以看出,装饰器本身也是一个闭包。
  2. 在定义装饰器decorator_func时,括号中的’func’指代被装饰器装饰的函数,在这段代码中指代的就是my_func函数。
  3. 在被装饰器装时候,函数的实际执行执行顺序变成了内部函数wrapper所指定的顺序。即先执行print(“Before calling the function”);再执行func()指代的my_func函数;最后执行print(“After calling the function”)。
  4. 本段代码的最终输出为:Before calling the function;Inside the function;After calling the function

3 使用装饰器记录函数执行次数

def cal_times(func):
    l=[]

    def wrapper(*var):
        l.append('1')
        func(*var)
        print("函数执行了%s次"%(len(l)))

    return wrapper


@cal_times
def my_func(i):
    print('%s的平方是%s'%(i,i**2))


my_func(5)
my_func(6)

my_func(i)函数中,我们增加了形参的输入,因此,在装饰器中,也要为之做出更改。此处装饰器中的wrapper函数我们使用*var传参,这种设计方式的优点是可以让这个装饰器适用于任何函数。
再加入了cal_times装饰器后,函数每运行一次,都会使列表l添加一个1,这样可以计算函数的运行次数。这段代码的运行结果如下:
在这里插入图片描述

4 带参数的装饰器

装饰器与函数一样,也可以带入参数,我们在第二节的基础上,对代码做出如下修改:

def decorator_func(param1, param2):
    def decorator(func):
        def wrapper():
            print("Before calling the function with params:", param1,param2)
            func()
            print("After calling the function")
        return wrapper
    return decorator

@decorator_func("hello", "world")
def my_func():
    print("Inside the function")

my_func()

这段代码使用了装饰器来在my_func函数调用前后打印额外的信息,并且装饰器函数decorator_func接受两个参数,在调用wrapper函数时使用这两个参数。
最终,代码将输出:Before calling the function with params: hello world; Inside the function;After calling the function。
如果同时还有字典类型的参数传入,可以使用(*var,**_var)进行解决

5 装饰器处理有返回值的函数

前面我们定义的函数都是执行某种功能,不涉及到return的相关操作。当涉及到处理有返回值的函数时,对于内部函数我们应该使用一个变量将函数的运行结果保存起来,并放在内层函数的return中。为了实现这一功能,我们将第三部分的代码做出如下修改:

def cal_times(func):
    l=[]

    def wrapper(*var):
        l.append('1')
        result = func(*var)
        print("函数执行了%s次"%(len(l)))
        return result

    return wrapper


@cal_times
def my_func(i):
    print('%s的平方是%s'%(i,i**2))
    return i**2


a = my_func(5)
b = my_func(6)

print(a,b)

对于这个装饰器,我们在内部函数wrapper使用result保存运行结果,并将result return,这样a与b就可以被正常的赋值,运行结果如下图。
在这里插入图片描述
而如果不执行保存result并return,a和b将不会得到任何值:
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/179024.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

RabbitMQ部署

RabbitMQ部署1.单机部署1.1.下载镜像1.2.安装MQ1.3访问管理端2.集群部署2.1.集群分类2.2.设置网络1.单机部署 我们在Centos7虚拟机中使用Docker来安装,如未安装dockr,请参考《Centos7安装Docker》 1.1.下载镜像 方式一:在线拉取 docker …

C语言linux线程库pthread的简单使用教程

POSIX线程(pthread)库 POSIX线程库是用于C/C的基于标准的线程API。它允许产生一个新的并发流程。它在多处理器或多核系统上最为有效,在这些系统中,可以将流程安排在另一个处理器上运行,从而通过并行或分布式处理提高速…

flask框架全解

文章目录简介wsgiref安装配置文件方式一(debug方式配置)方式二(环境变量方式,很少见)方式三(配置文件方式)其他配置方式flask app路由组成写法动态路由的过滤查询字符串传参json和form等数据反向…

deepin系统如何安装惠普打印机

deepin系统如何安装惠普打印机 导读 想必现在有很多小伙伴对于deepin系统如何安装惠普打印机 安装惠普打印机的方法方面的知识都比较想要了解,那么今天小好小编就为大家… 想必现在有很多小伙伴对于deepin系统如何安装惠普p1007打印机 安装惠普打印机的方法方面的知…

【图卷积神经网络】02-谱域图卷积介绍

注:本文为第2章谱域图卷积介绍视频笔记,仅供个人学习使用 目录1、图卷积简介1.1 图卷积网络的迅猛发展1.2 回顾,经典卷积神经网络已在多个领域取得成功1.3 两大类数据1.4 经典卷积神经网络的局限:无法处理图数据结构1.5 将卷积扩展…

Python学习基础之快速入门

目录 首先我们下载最新的python版本:3.0 编写一个hello world 什么是python里面的IPO python运行有几种模式 编写一个温度转换器 在windows上执行python程序 官网:Welcome to Python.org Python 是一门易于学习、功能强大的编程语言。它提供了高效的…

保护视力台灯是白光还是暖光?盘点专业护眼的暖光护眼台灯

保护视力的灯光颜色是最接近太阳光最好,而白光与暖光主要是色温来控制的,低色温(3000K以下),中性色温(4000K左右),高色温(5000K以上),低色温的光源…

在不受支持的 Mac 上安装 macOS Ventura、Monterey、Big Sur (OpenCore Legacy Patcher)

在不受支持的 Mac 上安装 macOS Ventura、Monterey、Big Sur (OpenCore Legacy Patcher) 请访问原文链接:https://sysin.org/blog/install-macos-13-on-unsupported-mac/,查看最新版。原创作品,转载请保留出处。 作者主页:www.s…

RabbitMQ入门与应用

RabbitMQ入门与应用1.初识MQ1.1.同步和异步通讯1.1.1.同步通讯1.1.2.异步通讯1.2.技术对比:2.快速入门2.1.安装RabbitMQ2.2.RabbitMQ消息模型2.3.导入Demo工程2.4.入门案例2.4.1.publisher实现2.4.2.consumer实现2.5.总结3.SpringAMQP3.1.Basic Queue 简单队列模型3…

python机器学习数据建模与分析——pandas中常用函数总结

本文主要对数据建模与分析中常使用到的pandas内置函数进行总结分析,以此来熟悉数据建模与分析的流程。 文章目录一、Pandas数据结构1.1 数据结构—Series1.1.1 Series的创建方式1.1.2 使用索引和获取数据1.2 数据结构—DataFrame1.2.1 DataFrame的创建方式1.2.2 使用…

变速积分PID算法及仿真

在普通的PID 控制算法中,由于积分系数k是常数,所以在整个控制过程中,积分增量不变。而系统对积分项的要求是,系统偏差大时积分作用应减弱甚至全无,而在偏差小时则应加强。积分系数取大了会产生超调,甚至积分…

强化学习笔记:基于价值的学习之价值迭代(python实现)

目录 1. 前言 2. 数学原理 3. 实现 3.1 Planner类 3.2 ValueIterationPlanner类 4. 运行结果及分析 1. 前言 在强化学习中,根据是否依赖于(环境的)模型,可以分为有模型(model-based)…

通信原理简明教程 | 模拟调制传输

文章目录1 模拟幅度调制1.1 模拟幅度调制的基本原理1.2 DSB-SC调制和AM调制1.3 SSB调制和VSB调制2 模拟角度调制2.1 角度调制的基本概念2.2 窄带调频和宽带调频2.3 调频信号的产生方法3 模拟调制系统的解调3.1 相干解调3.2 非相干解调4 模拟调制系统的抗噪声性能4.1 抗噪声性能…

Service Mesh

Service Mesh 参考如下文章:可以将此文章看作为下面文章的结合: https://zhuanlan.zhihu.com/p/61901608 https://philcalcado.com/2017/08/03/pattern_service_mesh.html https://zhuanlan.zhihu.com/p/153105848?from_voters_pagetrue 微服务演化进…

浅谈 开源许可证

目录浅谈 开源许可证一、什么是开源许可证1.1 什么是开源1.2 什么是开源许可证Copyleft 许可证(Copyleft 许可证)宽松许可证(permissive 许可证)二、为什么要有开源许可证2.1、No License:没有开源许可证意味着什么2.2…

38.Isaac教程--AprilTags

AprilTags ISAAC教程合集地址文章目录AprilTags源码Isaac Codelet运行示例应用程序在主机系统上运行示例应用程序在 Jetson 上运行应用程序在 Websight 中查看应用程序的输出AprilTags 是一种流行的基准标记形式。 它在机器人技术中有广泛的应用,包括对象跟踪、视觉…

数据挖掘领域十大经典算法

一、什么是数据挖掘?数据挖掘是人工智能和数据库领域研究的热点问题,所谓数据挖掘是指从数据库的大量数据中揭示出隐含的、先前未知的并有潜在价值的信息的非平凡过程。数据挖掘是一种决策支持过程,它主要基于人工智能、机器学习、模式识别、…

蓝桥杯STM32G431RBT6学习——USART

蓝桥杯STM32G431RBT6学习——USART 前言 串口在蓝桥杯近几届中考频也相对较高(十三、十二届均考),因此必然也要学习一下。 作为后来之秀的开源项目DAP Link不仅支持SWD调试下载,同时还支持串口调试功能,国信长天开…

软件课设(Ⅲ)——padavan-ng编译以及内核模块修改

我记得今年的很多笔试面试都遇到了linux相关的操作,答题状况都挺……昂。算是补课吧,正好大四的毕业实习、软3还有研0的项目都需要linux的环境进行推进,记录一下,聊作纪念。 实验要求 编译系统,下载并提交,…

大数据技术之Hadoop(Yarn)

第1章 Yarn资源调度器 我们先来思考下面几个问题: 1)如何管理集群资源? 2)如何给任务合理分配资源? Yarn是一个资源调度平台,负责为运算程序提供服务器运算资源,相当于一个分布式的操作系统平…