@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的潜能。您的每一次互动都是对我的极大鼓励,也是我们共同成长的动力!
“👇 关注并开启星标提醒,让知识与技能的火花不断在你的职业道路上燃烧吧!
原文作者:数据派探险家;如有侵权,请联系管理员删除。