Skip to Content
《学习 Python》第 5 版
book

《学习 Python》第 5 版

by Mark Lutz
May 2025
Intermediate to advanced
1648 pages
23h 5m
Chinese
O'Reilly Media, Inc.
Content preview from 《学习 Python》第 5 版

第 39 章 装饰者

本作品已使用人工智能进行翻译。欢迎您提供反馈和意见:translation-feedback@oreilly.com

在本书的高级类主题一章(第 32 章)中,我们认识了静态方法和类方法,快速浏览了 Python 为声明它们提供的@ 装饰器语法,并预览了装饰器编码技术。我们还在第 38 章探索property 内置作为装饰器的能力时,以及在第 29 章学习抽象超类概念时,简单地认识了函数装饰器。

在本章中,我们将深入探讨装饰器的内部工作原理,并学习更高级的方法来编写新的装饰器代码。我们将看到,我们之前学习过的许多概念--尤其是状态保持--经常出现在装饰器中。

这是一个有些高深的话题,装饰器的构造往往是工具构建者比应用程序程序员更感兴趣的话题。尽管如此,考虑到装饰器在流行的 Python 框架中越来越常见,即使你只是装饰器的使用者,对装饰器的基本了解也有助于揭开其作用的神秘面纱。

除了介绍装饰器的构造细节外,本章还是 Python 在实际应用中的一个更真实的案例研究。 由于本章的示例比我们在本书中看到的其他大多数示例都要大一些,因此它们能更好地说明代码是如何组合成更完整的系统和工具的。还有一个额外的好处,我们在这里编写的一些代码可能会被用作日常程序中的通用工具。

什么是装饰师?

装饰是指定函数和类的管理或增强代码的一种方式。装饰器本身的形式是处理其它可调用对象的可调用对象 (如函数)。正如我们在本书前面所看到的,Python 装饰器有两种相关的味道,它们都不需要 3.X 或新式类:

  • Python 2.4 中添加的函数装饰器在函数定义时进行名称重绑定,提供了一层逻辑,可以管理函数和方法,或以后对它们的调用。

  • 在 Python 2.6 和 3.0 中添加的类装饰器在类定义时进行名称重绑定,提供了一个逻辑层,可以管理类或以后调用它们所创建的实例。

简而言之,装饰器提供了一种在函数和类定义语句末尾插入自动运行代码的方法--对于函数装饰器,是在def 的末尾;对于类装饰器,是在class 的末尾。这些代码可以发挥多种作用,下文将对此进行介绍。

管理呼叫和实例

在典型的使用中,这种自动运行的代码可用于增强对函数和类的调用。它通过安装wrapper(又称代理)对象来实现这一点,以便稍后调用:

呼叫代理

函数装饰器安装了包装器对象,用于拦截后面的函数调用,并根据需要对其进行处理,通常会将调用传递给原始函数,以运行托管操作。

接口代理

类装饰器安装了包装器对象,用于拦截稍后的实例创建调用,并根据需要对其进行处理,通常会将调用传递给原始类以创建受管实例。

装饰器通过在defclass 语句的末尾自动将函数和类名重新绑定到其他可调用程序来实现这些效果。在以后调用时,这些可调用程序可以执行一些任务,如跟踪和计时函数调用、管理对类实例属性的访问等。

管理函数和类

本章中的大多数示例都涉及使用包装器拦截对函数和类的后续调用,但这并不是使用装饰器的唯一方法:

职能经理

函数装饰器也可用于管理函数对象,而不是稍后对其进行调用,例如向 API 注册函数。不过,我们在此主要关注的是它们更常用的调用包装器应用。

班级管理者

类装饰器还可用于直接管理类对象,代替或补充实例创建调用--例如,为类添加新方法。 由于这种作用与元类的作用有很大的交叉,我们将在下一章看到更多的用例。我们会发现,这两种工具都在类创建过程的末尾运行,但类装饰器通常能提供更轻量级的解决方案。

换句话说,函数装饰器既可用于管理函数调用,也可用于管理函数对象;类装饰器既可用于管理类实例,也可用于管理类本身。通过返回被装饰对象本身而不是包装器,装饰器成为函数和类的一个简单的创建后步骤。 ...

Become an O’Reilly member and get unlimited access to this title plus top books and audiobooks from O’Reilly and nearly 200 top publishers, thousands of courses curated by job role, 150+ live events each month,
and much more.

Read now

Unlock full access

More than 5,000 organizations count on O’Reilly

AirBnbBlueOriginElectronic ArtsHomeDepotNasdaqRakutenTata Consultancy Services

QuotationMarkO’Reilly covers everything we've got, with content to help us build a world-class technology community, upgrade the capabilities and competencies of our teams, and improve overall team performance as well as their engagement.
Julian F.
Head of Cybersecurity
QuotationMarkI wanted to learn C and C++, but it didn't click for me until I picked up an O'Reilly book. When I went on the O’Reilly platform, I was astonished to find all the books there, plus live events and sandboxes so you could play around with the technology.
Addison B.
Field Engineer
QuotationMarkI’ve been on the O’Reilly platform for more than eight years. I use a couple of learning platforms, but I'm on O'Reilly more than anybody else. When you're there, you start learning. I'm never disappointed.
Amir M.
Data Platform Tech Lead
QuotationMarkI'm always learning. So when I got on to O'Reilly, I was like a kid in a candy store. There are playlists. There are answers. There's on-demand training. It's worth its weight in gold, in terms of what it allows me to do.
Mark W.
Embedded Software Engineer

You might also like

学习 Java,第 6 版

学习 Java,第 6 版

Marc Loy, Patrick Niemeyer, Daniel Leuck
《高性能 Python》第二版

《高性能 Python》第二版

Micha Gorelick, Ian Ozsvald

Publisher Resources

ISBN: 9798341656963