Python基础篇(十一):装饰器

news2025/5/18 3:43:55

装饰器

  • 前言
  • 1. 装饰器的定义
  • 2. 装饰器的应用
  • 3. 装饰器的语法
  • 4. func(*args, **kwargs)

前言

装饰器是Python中一种强大的函数或类修饰机制,用于在不修改原始函数或类代码的情况下,对其进行功能扩展或修改。装饰器基于函数式编程的概念,通过将函数作为参数传递给另一个函数,并返回一个新的函数来实现。

下面是关于装饰器的介绍和示例:

1. 装饰器的定义

装饰器是一个函数,它接受一个函数作为输入,并返回一个新的函数作为输出。装饰器可以在不修改原始函数的情况下,为其添加额外的功能或修改其行为。(感觉像java中的面向切面编程~)

2. 装饰器的应用

装饰器常用于以下场景:

  • 添加日志记录
  • 计时统计
  • 输入验证和修正
  • 缓存结果
  • 权限验证
  • 错误处理

3. 装饰器的语法

装饰器使用@符号紧跟在函数定义的上方,表示将函数装饰为另一个函数。装饰器函数可以接受任意数量的参数,并返回一个新的函数。 在示例中,decorator函数是一个装饰器函数,它接受一个函数作为参数并返回一个新的函数wrapperwrapper函数在调用原始函数之前和之后执行一些操作,然后调用原始函数并返回其结果。通过在原始函数上方使用@decorator语法,将原始函数装饰为经过装饰器修饰的新函数。

示例:

def decorator(func):
    def wrapper(*args, **kwargs):
        # 在调用原始函数之前执行的操作
        print("执行装饰器前操作")
        # 调用原始函数
        result = func(*args, **kwargs)
        # 在调用原始函数之后执行的操作
        print("执行装饰器后操作")
        # 返回原始函数的结果
        return result
    return wrapper

# 应用装饰器
@decorator
def my_function():
    print("原始函数")

# 调用装饰后的函数
my_function()

运行以上示例,将会输出:

执行装饰器前操作
原始函数
执行装饰器后操作

在这里插入图片描述
在这里插入图片描述

装饰器是Python中强大且常用的特性,它可以轻松地扩展和修改函数的功能,同时提高了代码的可重用性和可读性。在实际开发中,装饰器常用于切面编程和元编程,为代码添加横切关注点和动态功能。

4. func(*args, **kwargs)

func(*args, **kwargs) 是一种在函数调用时传递可变数量参数的方式,其中 argskwargs 是两种常用的参数形式。

  • *args 表示将参数作为一个元组(tuple)传递给函数。它允许你传递任意数量的位置参数给函数,这些参数会被打包成一个元组传递给函数内部。函数内部可以使用 args 来访问这个元组,并对其中的参数进行操作。

  • **kwargs 表示将参数作为一个字典(dict)传递给函数。它允许你传递任意数量的关键字参数给函数,这些参数会被打包成一个字典传递给函数内部。函数内部可以使用 kwargs 来访问这个字典,并对其中的参数进行操作。

下面示例来说明 func(*args, **kwargs) 的使用:

def example_func(*args, **kwargs):
    print("位置参数:")
    for arg in args:
        print(arg)
    
    print("关键字参数:")
    for key, value in kwargs.items():
        print(key, value)

# 传递位置参数和关键字参数
example_func(1, 2, 3, name="John", age=25)

运行以上示例,将会输出:

位置参数:
1
2
3
关键字参数:
name John
age 25

在示例中,example_func 函数使用了 *args**kwargs 来接受任意数量的位置参数和关键字参数。通过调用 example_func(1, 2, 3, name="John", age=25),将 1、2 和 3 作为位置参数传递,而 name 和 age 则作为关键字参数传递。函数内部可以使用 argskwargs 来访问这些参数,并对它们进行操作。这种方式使得函数能够处理不确定数量的参数,使函数的使用更加灵活和通用。

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

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

相关文章

【计算机网络详解】——知识点复习(期末不挂科版)

配套视频:湖科大教书匠 配套教材:计算机网络(第8版) 谢希仁 根据学习通要求“掌握”的部分总结的,有亿点点长 ,时间来不及就掌握画 ☆ 的就好啦 目录 🕒 1. 概述🕘 1.1 三种数据交换…

[英语单词] gated; cycle gated

gate *[geit] n. 门, 牌楼, 大门, 通道, 闸 vt. 装门于 门的原始作用就显示出来了,就是为了在主人自由进出的同时,保护私有财产的安全。 如果加了-ed,就代表使用了动词性,相当于给谁谁加了一个门,限制其行为的自由度。…

SpringBoot 如何使用 ACL 进行访问控制

SpringBoot 如何使用 ACL 进行访问控制 在现代 Web 开发中,访问控制是一个非常重要的问题。访问控制可以帮助我们保护敏感信息、防止恶意攻击、维护系统安全等。Spring Security 是一个非常流行的安全框架,它提供了一系列的认证和授权功能,可…

【网络1】协议及相关命令

文章目录 1.局域网:CSMA/CD2.互联网:ARP,DHCP,NAT3.TCP协议:telnet,tcpdump,syn/accept队列4.HTTPS协议:摘要(sha、md5、crc)。win对文件MD5校验:…

【博弈论笔记】第三章 完全且完美信息动态博弈

文章目录 第三章 完全且完美信息动态博弈3.1 动态博弈的表示法和特点3.2 策略的可信性和纳什均衡的不稳定问题3.2.1 相机选择和策略的可信性问题3.2.2 纳什均衡的不稳定问题3.2.3 逆推归纳法 3.3 子博弈和子博弈完美纳什均衡3.3.1 子博弈3.3.2 子博弈完美纳什均衡 3.4 四个经典…

规则引擎--函数式编程和and/or操作符的设计

目录 Java函数编程的一些基础知识BiFunctionBinaryOperatorstream reduce And, Or操作符and 逻辑 的 Combiner 如下:or 逻辑 的 Combiner 如下:and, or的执行 接上一篇博文:规则引擎–规则逻辑形如“1 & (2 | 3)“的抽象, 重点分析一下And, Or操作符…

反射(reflection)详细讲解

反射(reflection) 反射机制允许程序在执行期借助于ReflectionAPI取得任何类的内部信息(比如成员变量,构造器,成员方法等等),并能操作对象的属性及方法。反射在设计模式和框架底层都会用到加载完类之后,在堆…

【博弈论笔记】第四章 重复博弈

文章目录 第四章 重复博弈4.1 重复博弈引论4.1.1 重复博弈定义和意义4.1.2 重复博弈的基本概念 4.2 有限次重复博弈4.2.1 两人零和博弈的有限次重复博弈4.2.2 唯一纯策略纳什均衡博弈的有限次重复博弈4.2.3 多个纯策略纳什均衡博弈的有限次重复博弈4.2.4 有限次重复博弈的民间定…

Python学习笔记(3)--字符串定义、拼接、格式化,表达式格式化,数据输入,布尔数据类型,比较运算符

传送门>B站黑马python入门教程 目录 1.字符串定义方式2.字符串拼接3.字符串格式化3.1 常用占位符3.2 格式化时的数字精度控制3.3 快速格式化字符串 4. 表达式格式化5. 数据输入-input语句6.布尔数据类型、比较运算符 1.字符串定义方式 在 python 语法中,字符串有三种定义方式…

Python爬虫 从小白到高手 Urllib

Urllib 1.什么是互联网爬虫? 如果我们把互联网比作一张大的蜘蛛网,那一台计算机上的数据便是蜘蛛网上的一个猎物,而爬虫程序就是一只小蜘蛛,沿着蜘蛛网抓取自己想要的数据 解释1:通过一个程序,根据Url(http…

行为型模式--访问者模式

目录 概述 结构 案例实现 优缺点 优点: 缺点: 使用场景 概述 封装一些作用于某种数据结构中的各元素的操作,它可以在不改变这个数据结构的前提下定义作用于这 些元素的新的操作。 结构 访问者模式包含以下主要角色: 抽象访问者&am…

采用SpringBoot+Tinymce实现文章的在线预览和上传

采用SpringBootTinymce实现文章的在线预览和上传 资源在gitee中 输入信息 预览

canvas详解09-像素操作

到目前为止,我们尚未深入了解 Canvas 画布真实像素的原理,事实上,你可以直接通过 ImageData 对象操纵像素数据,直接读取或将数据数组写入该对象中。稍后我们也将深入了解如何控制图像使其平滑(反锯齿)以及如何从 Canvas 画布中保存图像。 #ImageData 对象 ImageData对象…

el-table渲染二级对象数组

1、序言 项目地址如下:https://gitee.com/liu-wenxin/complexELTable.git 想要渲染这样的数据: el-table官网给的例子都是一级对象数组,如果想要渲染二级对象数组,直接 :table tableData 这样el-table渲染是不成功的&am…

RadEx Pro处理电火花数据操作步骤(下)

RadEx Pro处理电火花数据操作步骤(上)主要讲述RadEx Pro读取电火花数据,查看数据的质量,以及简单的滤波和振幅纠正。 6、海底拾取,建立流程060 seafloor pick Trace Input加载stack数据集 Trace Header Math&#x…

【人工智能】— 维度灾难、降维、主成分分析PCA、获取旧数据、非线性主成分分析

【人工智能】— 维度灾难、降维、主成分分析PCA、获取旧数据、非线性主成分分析 高维数据与维度灾难维度灾难降维为什么需要降维?PRINCIPLE COMPONENT ANALYSIS主成分的几何图像最小化到直线距离的平方和举例主成分的代数推导优化问题计算主成分(Princip…

【Pandas】pandas用法解析(上)

目录 一、生成数据表 1.导入pandas库 2.导入CSV或者xlsx文件 3.用pandas创建数据表 二、数据表信息查看 1.维度查看 2.数据表基本信息(维度、列名称、数据格式、所占空间等) 3.每一列数据的格式 4.某一列格式 5.空值判断 6.查看某一列空值 7…

黑马程序员前端 Vue3 小兔鲜电商项目——(七)详情页

文章目录 路由配置模板代码配置路由链接跳转 渲染基础数据封装接口渲染数据 热榜区域模板代码封装接口渲染数据 图片预览组件封装小图切换大图显示模版代码绑定事件 放大镜效果图片优化 SKU组件熟悉全局组件统一插件化插件化开发插件注册 路由配置 模板代码 创建 src\views\D…

快速排序-详解附Python代码

排序思路 取一个元素P(第一个元素),目标是使得元素P归位;列表被元素P分成了两个部分,左边的比P小,右边的比P大;分别再对左右两个部分的列表重复1,2步骤,递归完成排序 评…

7Z010 引脚功能详解

本文针对7Z010芯片,详细讲解硬件设计需要注意的技术点,可以作为设计和检查时候的参考文件。问了方便实用,按照Bank顺序排列,包含配置Bank、HR Bank、HP Bank、GTX Bank、供电引脚等。 参考文档包括: ds187-XC7Z010-X…