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

Python 中的 @ 符号是如何工作的!

写在前面

Python 中的 @ 符号是一个非常强大而又灵活的功能,它代表一个叫做"装饰器"的"语法糖"。在本文中,我们将一步步地了解它的工作原理,并通过示例代码加深理解。

基本概念

在 Python 中,@ 符号通常用于函数定义之前,它被称为"装饰器"。一个最简单的例子如下:

@print  
def say_hello():  print("Hello, world!")  say_hello()  

当我们运行这段代码时,输出将是:

<function say_hello at 0x7f6a1c0c8940>  

这是怎么回事?原来,@print 其实是将 say_hello 函数"装饰"或"包装"了一层 print 函数。换句话说,say_hello = print(say_hello) 被隐式地执行了。

工作原理

现在让我们更深入地探讨一下装饰器的内部机制。装饰器的工作原理可以概括为以下几个步骤:

  1. 定义装饰器函数

  2. 将装饰器应用于目标函数

  3. 在运行时替换目标函数

让我们通过一个例子来演示这个过程:

def uppercase(func):  def wrapper(*args, **kwargs):  result = func(*args, **kwargs)  return result.upper()  return wrapper  @uppercase  
def say_hello(name):  return f"hello, {name}"  print(say_hello("Alice"))  # HELLO, ALICE  
  1. 定义装饰器函数 uppercase。这个函数接受一个函数 func 作为参数,并返回一个新的函数 wrapper

  2. 使用 @uppercase 语法将 uppercase 装饰器应用于 say_hello 函数。这实际上是将 say_hello 函数传递给 uppercase 函数,并将返回值重新赋值给 say_hello

  3. 当我们调用 say_hello("Alice") 时,实际上调用的是 wrapper 函数,而不是原始的 say_hello 函数。wrapper 函数会调用原始的 say_hello 函数,并对其返回值进行大写转换。

通过这个过程,我们成功地在不改变 say_hello 函数本身的情况下,扩展了它的功能。这就是装饰器的核心机制。

带参数的装饰器

有时,我们可能需要为装饰器添加参数。这可以通过嵌套装饰器来实现:

def repeat(n):  def decorator(func):  def wrapper(*args, **kwargs):  result = func(*args, **kwargs)  return result * n  return wrapper  return decorator  @repeat(3)  
def say_hello(name):  return f"hello, {name}"  print(say_hello("Alice"))  # hello, Alice hello, Alice hello, Alice  

在这个例子中,repeat 函数是一个"装饰器工厂",它返回一个装饰器函数 decoratordecorator 函数接受原始函数 func 作为参数,并返回一个新的 wrapper 函数。wrapper 函数在内部调用 func,并将其返回值重复 n 次。

通过 @repeat(3) 语法,我们将 say_hello 函数"装饰"到了 repeat(3) 中,从而使得 say_hello 函数的返回值被重复 3 次。

总结

在本节中,我们深入探讨了 Python 中 @ 符号的内部原理和机制。我们了解到,@ 符号只是一种语法糖,实际上会被转换为普通的函数调用和赋值操作。我们还介绍了定义装饰器函数、将装饰器应用于目标函数,以及在运行时替换目标函数的过程。通过这些知识,相信您已经对 Python 中的 @ 符号有了更深入的理解。

关于Python技术储备

学好 Python 不论是就业还是做副业赚钱都不错,但要学会 Python 还是要有一个学习规划。最后给大家分享一份全套的 Python 学习资料,给那些想学习 Python 的小伙伴们一点帮助!

包括:Python激活码+安装包、Python web开发,Python爬虫,Python数据分析,人工智能、自动化办公等学习教程。带你从零基础系统性的学好Python!

点击领取,100%免费!

👉Python所有方向的学习路线👈

Python所有方向路线就是把Python常用的技术点做整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。(全套教程文末领取)

在这里插入图片描述

👉Python学习视频600合集👈

观看零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。

在这里插入图片描述

温馨提示:篇幅有限,已打包文件夹,获取方式在:文末
👉Python70个实战练手案例&源码👈

光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。

在这里插入图片描述

👉Python大厂面试资料👈

我们学习Python必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。

在这里插入图片描述

在这里插入图片描述

👉Python副业兼职路线&方法👈

学好 Python 不论是就业还是做副业赚钱都不错,但要学会兼职接单还是要有一个学习规划。

在这里插入图片描述

👉 这份完整版的Python全套学习资料已经上传,朋友们如果需要可以扫描下方CSDN官方认证二维码或者点击链接免费领取保证100%免费

在这里插入图片描述


http://www.mrgr.cn/news/60361.html

相关文章:

  • 怎么看AI大模型(LLM)、智能体(Agent)、知识库、向量数据库、知识图谱,RAG,AGI 的不同形态?
  • 深度学习(六)CNN:图像处理的强大工具(6/10)
  • vue使用阿里svg图标
  • 传输层TCP
  • WebSocket简单使用
  • MyBatis 源码分析 - SQL执行过程(三)之 ResultSetHandler
  • Android 应用申请 Google MBA权限
  • 智诊小助手-AP/Station模式切换
  • 渗透测试的主要目的是什么?渗透测试入门到精通教程,收藏这一篇就够了
  • 大模型 “蓝图” 进阶学习路线:构建大模型岗位就业之路
  • 企业数字化转型:平台与大数据算法的力量
  • 使用EmbeddedBuilder可视化编程找不到GD32H7XX
  • MYSQ-语句操作、查询和多表关系思维导图
  • Nature子刊丨在多孔固体电解质反应器中从(bi)碳酸盐中电化学再生高纯度CO2以实现高效碳捕获
  • ubuntu18.04安装xenomai3.1(百分百成功版)
  • NVR监测软件/设备EasyNVR多个NVR同时管理解决方案
  • 鸿蒙开发与Android开发对比
  • 怎么在抖音视频里标注店铺定位信息?
  • 【深搜算法】(第六篇)
  • 新股友一开始能赚钱,背后有哪些原因?
  • 解决风电运维难困局?8K风机叶片巡检有妙用
  • 什么是服务器?服务器与客户端的关系?本地方访问不了网址与服务器访问不了是什么意思?有何区别
  • 自动化网络部署(paramiko,Netmiko)
  • Linux CentOS7下创建SFTP服务器
  • 牛客周赛65(C++实现)
  • 探秘计算机网络:网络流量分析与 TCP 标志位解析