深入解析Python装饰器及*args, **kwargs的妙用

深入解析Python装饰器及*args, **kwargs的妙用

简介:

​ 装饰器(Decorator)是 Python 中一种强大的语法特性,它允许在不修改原始函数代码的情况下,动态地扩展函数的功能。装饰器是函数或类,用于包装其他函数或类,并提供额外的功能。

​ 在 Python 中,装饰器通过使用 @ 符号将其应用于函数或类。装饰器可以在函数定义之前定义,并在函数调用时自动应用。以下是装饰器的基本语法:

@decorator
def function():# 函数体

decorator 是一个装饰器,它将被应用于下方定义的函数 function。装饰器可以是一个函数或一个类。

基础铺垫:

*args

​ 在函数定义中,*args 表示接受任意数量的位置参数。它将传递的参数打包成一个元组(tuple),可以在函数体内使用。这样,函数就可以处理不确定数量的参数。

def calculate_sum(*args):total = sum(args)return totalresult = calculate_sum(1, 2, 3, 4, 5)
print(result) # 输出15
解包:

​ 解包是指将一个容器(如元组、列表、字典等)中的值拆分为独立的元素。在函数调用或变量赋值的过程中,可以使用解包操作将容器中的值分配给对应的变量。

def my_function(a, b, c):print(a, b, c)args = (1, 2, 3)
my_function(*args)  # 解包元组,等同于 my_function(1, 2, 3)
**kwargs

**kwargs 表示接受任意数量的关键字参数。它将传递的参数打包成一个字典(dictionary),可以在函数体内使用。这样,函数就可以处理不确定数量的关键字参数。关键字参数就是,a=b,指定谁等于谁。

def print_values(**kwargs):for key, value in kwargs.items():print(f"{key}: {value}")print_values(name="Alice", age=25, city="London")

输出:

name: Alice
age: 25
city: London
配合使用:
def my_function(a, b, c):print(a, b, c)args = (1, 2, 3)
kwargs = {"a": 4, "b": 5, "c": 6}my_function(*args)         # 等同于 my_function(1, 2, 3)
my_function(**kwargs)      # 等同于 my_function(a=4, b=5, c=6)

在这里插入图片描述

深入分析:

案例一:
import timedef calculate_time(func):  # 这个函数的参数就是被装饰的函数即 func=my_functiondef wrapper():start_time = time.time()print("开始计时")func()end_time = time.time()print("结束计时")print("函数执行时间:", end_time - start_time, "秒")return wrapper@calculate_time  # 相当于 calculate_time(my_function) 将函数作为参数
def my_function():time.sleep(2)print('我是被装饰函数')

@calculate_time 是将 calculate_time 函数作为一个装饰器。

我花了一幅图片给大家看看执行过程:

在这里插入图片描述

​ 其实很简单,就是装饰器函数被被装饰函数当作参数来进行调用,然后装饰器的写法是固定的。

在这里插入图片描述

案例二:
def outer(f):  # 2.f == func 将被装饰函数的名字传递给参数fdef inner():# 6.执行inner函数体操作f()  # 6.1.调用原先的func函数print('注册功能')  # 6.2 执行添加的新功能return inner  # 3.此处的返回值会返回给被装饰函数的名字@outer  # 1.调用outer装饰器函数
def func():  # 4. func == innerprint('登录功能')func()  # 5.func() == inner()
# 需求:给func函数增添一个注册功能

在这里插入图片描述

案例三:

​ 我们看看下面这个案例,通过装饰器,我们可以丰富每个函数的功能,可以使代码更加模块化和可复用。

def outer(func):def inner():print('认证功能操作')result = func()return resultreturn inner# 基础平台部门开发了上百个函数的API
@outer # 调用装饰器函数 函数参数是另一个函数 
def f1():print('业务部门1的数据接口......')@outer
def f2():print('业务部门2的数据接口......')@outer
def f3():print('业务部门3的数据接口......')@outer
def f100():print('业务部门100的数据接口......')# 无参
f1()
f2()
f3()
f100()
案例四:
def outer(func):def inner(name):print('新功能!')func(name)return inner@outer #相当于f1 = outer(f1(name))
def f1(name):print('f1的原有功能,f1的参数值为:', name)f1('xxxx')

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Leetcode 剑指 Offer II 058. 我的日程安排表 I

题目难度: 中等 原题链接 今天继续更新 Leetcode 的剑指 Offer(专项突击版)系列, 大家在公众号 算法精选 里回复 剑指offer2 就能看到该系列当前连载的所有文章了, 记得关注哦~ 题目描述 请实现一个 MyCalendar 类来存放你的日程安排。如果要添加的时间内…

DevC++ easyx实现图片拖动,一种悬浮窗实现原理与完整代码

翻出来之前写的代码, EasyxDevC开发地图编辑和游戏编辑代码工程文件附注释_哔哩哔哩_bilibili 每次把代码备份下来,等着有一天能够复用代码,产生新的价值。 结果最近这几天才来回顾记录emm “这是怎么搓出来的?”从10行代码到…

虚拟机安装

带你解密Linux的【Vm】-CSDN博客https://blog.csdn.net/lz17267861157/article/details/134031133

音画欣赏|《同杯万古尘》

《同杯万古尘》 尺寸:69x35cm 陈可之2023年绘 《拟古十二首-其九》 李白 生者为过客,死者为归人。 天地一逆旅,同悲万古尘。 月兔空捣药,扶桑已成薪。 白骨寂无言,青松岂知春。 前后更叹息,浮荣安足珍&am…

如何在Windows上搭建WebDAV服务并通过内网穿透实现公网访问

文章目录 前言1. 安装IIS必要WebDav组件2. 客户端测试3. 使用cpolar内网穿透,将WebDav服务暴露在公网3.1 安装cpolar内网穿透3.2 配置WebDav公网访问地址 4. 映射本地盘符访问 前言 在Windows上如何搭建WebDav,并且结合cpolar的内网穿透工具实现在公网访…

基于python的excel检查和读写软件

软件版本:python3.6 窗口和界面gui代码: class mygui:def _init_(self):passdef run(self):root Tkinter.Tk()root.title(ExcelRun)max_w, max_h root.maxsize()root.geometry(f500x500{int((max_w - 500) / 2)}{int((max_h - 300) / 2)}) # 居中显示…

Linux 一键部署二进制Gitea

gitea 前言 Gitea 是一个轻量级的 DevOps 平台软件。从开发计划到产品成型的整个软件生命周期,他都能够高效而轻松的帮助团队和开发者。包括 Git 托管、代码审查、团队协作、软件包注册和 CI/CD。它与 GitHub、Bitbucket 和 GitLab 等比较类似。 Gitea 最初是从 Gogs 分支而来…

Qt WebAssembly开发环境配置

目录 前言1、下载Emscripten SDK2、 安装3、环境变量配置4、QtCreator配置5、运行示例程序总结 前言 本文主要介绍 Qt WebAssembly 开发环境的配置。Qt for Webassembly 可以使Qt应用程序在Web上运行。WebAssembly(简称Wasm)是一种能够在虚拟机中执行的…

使用Java语言中的算法输出杨辉三角形

一、算法思想 创建一个名为YanghuiTest的类,然后创建二维数组,然后遍历二维数组的第一层,然后初始化第二层数组的大小,然后遍历第二层数组,然后将两侧的数组元素赋为1,然后其它数值通过公式计算,最后可以输…

【昆明*线上同步】最新ChatGPT/GPT4科研实践应用与AI绘图技术及论文高效写作

详情点击查看福利:【昆明*线上同步】最新ChatGPT/GPT4科研实践应用与AI绘图技术及论文高效写作 目标: 1、熟练掌握ChatGPT提示词技巧及各种应用方法,并成为工作中的助手。 2、通过案例掌握ChatGPT撰写、修改论文及工作报告,提供…

高级数据结构 <二叉搜索树>

本文已收录至《数据结构(C/C语言)》专栏! 作者:ARMCSKGT 目录 前言正文二叉搜索树的概念二叉搜索树的基本功能实现二叉搜索树的基本框架插入节点删除节点查找函数中序遍历函数析构函数和销毁函数(后序遍历销毁)拷贝构造和赋值重载(前序遍历创建)其他函数…

Leetcode 435 无重叠区间

题意理解: 给定一个区间的集合 intervals 要求需要移除区间,使剩余区间互不重叠 目标:最少需要移除几个区间。 解题思路: 采用贪心思路解题,什么是全局最优解,什么是局部最优解。 全局最优解,删…

【华为鸿蒙系统学习】- 如何利用鸿蒙系统进行App项目开发|自学篇

🌈个人主页: Aileen_0v0 🔥热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法 💫个人格言:"没有罗马,那就自己创造罗马~" 目录 创建鸿蒙第一个App项目 项目创建 工程目录区 预览区 运行Hello World 基本工程目录 ws:工…

[node]Node.js 模块系统

[node]模块系统 Node.js中的模块系统模块的使用模块的导入模块的导出导出多个值导出默认值导出可传参的函数 文件查找策略从文件模块缓存中加载从原生模块加载从文件加载 Node.js中的模块系统 为了让Node.js的文件可以相互调用,Node.js提供了一个简单的模块系统。 …

docker容器内 获取宿主机ip

可以使用命令 --add-host jargatewayip:192.168.0.47 \ 需要注意,这里不能是 127.0.0.1 ,所以要找到服务器局域网的ip 命令示例 docker run -it \-p 80:80 \-p 443:443 \--name nginx \--network app --hostname nginx \-e TZAsia/Shanghai \--add-host jargatewayip:192.16…

modbus异常错误码说明

异常错误码说明 其中物理离散量输入和输入寄存器只能有I/O系统提供的数据类型,即只能是由I/O系统改变离散量输入和输入寄存器的数值,而上位机程序不能改变的数据类型,在数据读写上表现为只读,而内部比特或者物理线圈和内部寄存器或…

图灵日记之java奇妙历险记--数据类型与变量运算符

目录 数据类型与变量字面常量数据类型变量语法格式整型变量浮点型变量字符型变量希尔型变量类型转换自动类型转换(隐式)强制类型转换(显式) 类型提升不同数据类型的运算小于4字节数据类型的运算 字符串类型 运算符算术运算符关系运算符逻辑运算符逻辑与&&逻辑或||逻辑非…

蚂蚁集团5大开源项目获开放原子 “2023快速成长开源项目”

12月16日,在开放原子开源基金会主办的“2023开放原子开发者大会”上,蚂蚁集团主导开源的图数据库TuGraph、时序数据库CeresDB、隐私计算框架隐语SecretFlow、前端框架OpenSumi、数据域大模型开源框架DB-GPT入选“2023快速成长开源项目”。 (图…

MySQL数据库 视图

目录 视图概述 语法 检查选项 视图的更新 视图作用 案例 视图概述 视图(View)是一种虚拟存在的表。视图中的数据并不在数据库中实际存在,行和列数据来自定义视图的查询中使用的表,并且是在使用视图时动态生成的。 通俗的讲,视图只保存…

React学习计划-React16--React基础(四)生命周期和diffing算法,key的作用

1. 生命周期 1. 声命周期的三个阶段(旧) 初始化阶段:由ReactDOM.render()触发—初次渲染 1. constructor() 2. componentWillMount() 3. render() 4. componentDidMount() > 常用一般在这个钩子中做一些初始化的事情,例如&am…