ITPub博客

首页 > 数据库 > 数据库开发技术 > Python魔法符号:20秒搞懂@在装饰器中的作用原理

Python魔法符号:20秒搞懂@在装饰器中的作用原理

原创 数据库开发技术 作者:jackzhang 时间:2024-05-11 06:30:00 0 删除 编辑
@print
def foo():
    pass

当我们运行以上代码后,输出结果如下:

它会打印出函数foo在内存中的位置。但是我们似乎并没有用到打印函数print()啊?为什么会这样呢?以下是原因所在:

上面的函数实际上等价于:

def foo():
    pass
hi = print(foo)

当我们运行上面的代码时,也会打印出函数foo在内存中的位置。

由于 @ 语法的存在,我们的打印功能 print(foo) 实际上被调用了 — 这就是为什么我们的 foo() 函数被打印出来的原因所在。

装饰器和被装饰对象

@something
def move():
    # 逻辑代码

这里:

  • something 是装饰器函数。
  • move 则是被装饰对象(被装饰器装饰的函数)。
action = something(move)

这里,我们的装饰器函数 something 接受被装饰对象函数 move 作为参数,因此,返回 something(move)。

一个稍微实用的示例

def move(animal):
    return animal + ' is running'

假设我们想要在不修改 move(animal) 函数源代码的前提下改变它的行为。我们可以像下面这样创建自己的装饰器函数来实现:

def add_extra(func):
    def wrapper(animal):
        return func(animal) + '!'
    return wrapper

@add_extra
def move(animal):
    return animal + ' is running'

这样,我们就可以在不修改目标函数源代码的情况下改变它的行为方式:

print(move('Dog'))
# Dog is running!

注意,在最后添加了一个感叹号 ! —— 这就是我们的装饰器函数 add_extra 的作用。

结论

希望本文能够让你加深你对装饰器的理解和应用。

—— 最后送大家一句圣人的话:道阻且长,行则将至;行而不辍,未来可期!


推荐阅读👇👇👇

成为Python高手:掌握这5个核心技能,迈入编程精英行列!

Python魔法参数:深入解析*args和**kwargs的强大用途

Python高级技术:10个显著优化你代码的Python OOP 技术

Python的方法链:一种可以让你优雅编码的技术!相信我,你值得拥有~~

Python技巧补给站:可以向你的同事炫耀的9个技巧,赶紧收藏起来~~

- END -

“

🌟 喜欢这篇文章吗?给个赞支持一下吧!🌟

如果你发现今天的内容对你有帮助,不妨点个赞并关注我,以便不错过更多关于Python、数据分析和机器学习的深入分析和最新趋势。我们一起探索数据的力量,解锁AI的潜能。您的每一次互动都是对我的极大鼓励,也是我们共同成长的动力!

“

👇 关注并开启星标提醒,让知识与技能的火花不断在你的职业道路上燃烧吧!

原文作者:数据派探险家;如有侵权,请联系管理员删除。

请登录后发表评论 登录
全部评论

注册时间:2017-12-19

  • 博文量
    119
  • 访问量
    55941