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全套学习资料已经上传,朋友们如果需要可以扫描下方优快云官方认证二维码或者点击链接免费领取保证100%免费

![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/711c5966aa7348dc9340894eea54e99f.png#pic_center在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值