返回介绍

7.1 装饰器基础知识

发布于 2024-02-05 21:59:47 字数 1166 浏览 0 评论 0 收藏 0

装饰器是可调用的对象,其参数是另一个函数(被装饰的函数)。2 装饰器可能会处理被装饰的函数,然后把它返回,或者将其替换成另一个函数或可调用对象。

2Python 也支持类装饰器,参见第 21 章。

假如有个名为 decorate 的装饰器:

@decorate
def target():
  print('running target()')

上述代码的效果与下述写法一样:

def target():
  print('running target()')

target = decorate(target)

两种写法的最终结果一样:上述两个代码片段执行完毕后得到的 target 不一定是原来那个 target 函数,而是 decorate(target) 返回的函数。

为了确认被装饰的函数会被替换,请看示例 7-1 中的控制台会话。

示例 7-1 装饰器通常把函数替换成另一个函数

>>> def deco(func):
...   def inner():
...     print('running inner()')
...   return inner  ➊
...
>>> @deco
... def target():  ➋
...   print('running target()')
...
>>> target()  ➌
running inner()
>>> target  ➍
<function deco.<locals>.inner at 0x10063b598>

❶ deco 返回 inner 函数对象。

❷ 使用 deco 装饰 target。

❸ 调用被装饰的 target 其实会运行 inner。

❹ 审查对象,发现 target 现在是 inner 的引用。

严格来说,装饰器只是语法糖。如前所示,装饰器可以像常规的可调用对象那样调用,其参数是另一个函数。有时,这样做更方便,尤其是做元编程(在运行时改变程序的行为)时。

综上,装饰器的一大特性是,能把被装饰的函数替换成其他函数。第二个特性是,装饰器在加载模块时立即执行。下一节会说明。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文