第5章 可调用对象和上下文的使用

我们可以使用collections.abc.Callable抽象基类和记忆化技术来创建类似函数的对象,但它们的运行速度会快一些,因为它们可以记忆上一次的处理结果。在一些情形下,为了优化算法的性能,记忆功能是基本的。

上下文使得资源的管理更优雅可靠。with语句定义了上下文并创建了一个上下文管理器来控制上下文中的资源使用。Python的文件通常都包含了上下文管理器;每当使用with语句时,它们就会被适当地关闭。我们会看到一些使用contextlib模块中的工具来创建上下文管理器的方式。

在Python 3.2中,抽象基类定义在collections模块中。

在Python 3.3中,抽象基类定义在有一个单独的、命名为collections.abd的子模块中。在本章中,我们会专注Python 3.3版本。基本定义和Python 3.2是相同的,但import语句可能会改变。

我们会看到一系列关于可调用对象的设计,并会演示为什么有状态的可调用对象在一些情形下比一个简单的函数更有用。在编写自己的上下文管理器之前,我们也会看一下如何使用Python中一些内置的上下文管理器。

在Python中有两种创建可调用对象的简单方式,如下所示。

  • 使用def语句创建一个函数。
  • 通过创建继承自collections.abc.Callable类的实例。

也可以将一个变量赋值为lambda表达式。一个lambda表达式是一个小的匿名函数,其中只包含了一个表达式语句。我们不倾向于将lambda表达式保存在变量中,因为当使用了一个类似函数的、并未使用def语句定义的可调用对象,这种做法就会带来困惑。

import collections.abc ...

Get Python面向对象编程指南 now with the O’Reilly learning platform.

O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.