第4章 抽象基类设计的一致性

Python 标准库为若干容器类的特性提供了抽象基类。Python 为内置的容器类(例如listmapset)提供了一致的框架。

另外,标准库也为数值类型提供了抽象基类。我们可以使用这些类来扩展Python支持的数值类型。

我们会通过collections.abc模块来了解抽象基类的基本概念。从这里开始,我们会关注抽象基类的一些用例,它们也是以后一些章节的主题。

我们有3个设计原则:封装、扩展和创建。除了了解各种容器和集合类型以外,我们可能还要了解封装或者扩展的一般概念。类似地,我们也会关注除了数值类型外一些其他想要实现的一般概念。

我们的目标是保证我们的程序能够和Python内置的特性无缝集成。例如,我们创建一个集合,最好能够让集合也实现一个__iter__()迭代器。一个实现了__iter__()的集合可以与for语句很好地集成。

抽象基类的核心定义在一个名为abc的模块中。模块中包括了创建抽象基类需要的修饰符和元类型。其他的类也依赖于这些定义。

在Python 3.2版本中,集合的抽象基类定义在collections中。但是,在Python 3.3版本中,抽象基类被分离到了一个独立的模块collections.abc中。

我们还会介绍numbers模块,因为它包含了数值类型的抽象基类的定义。io模块包含了I/O的抽象基类。

我们主要基于Python 3.3版本讨论。Python 3.3版本中的定义对Python 3.2版本也同样适用,只是由于库的结构有一些变化,需要稍微修改一下import语句。

一个抽象基类具有以下特性。

  • 抽象意味着这些类中不包括我们需要的所有方法的定义。为了让它成为一个真正有用的子类,我们需要提供一些方法定义。 ...

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.