13.3 类
回想一下,类是一种数据结构,我们可以用它来定义对象,后者把数据值和行为特性融合在一起。类是现实世界的抽象的实体以编程形式出现。实例是这些对象的具体化。可以类比一下,类是蓝图或者模型,用来产生真实的物体(实例)。因此为什么是术语“class” ?这个术语很可能起源于使用类来识别和归类特定生物所属的生物种族,类还可以派生出相似但有差异的子类。编程中类的概念就应用了很多这样的特征。
在Python中,类声明与函数声明很相似,头一行用一个相应的关键字,接下来是一个作为它的定义的代码体,如下所示:
二者都允许你在他们的声明中创建函数,闭包或者内部函数(即函数内的函数),还有在类中定义的方法。最大的不同在于你运行函数,而类会创建一个对象。类就像一个Python容器类型。在这部分,我们将特别留意类及它们有什么类型的属性。这只要记住,尽管类是对象(在Python中,一切皆对象),但正被定义时,它们还不是对象的实现。在下节中会讲到实例,所以拭目以待吧。不过现在,我们集中讲解类对象。
当你创建一个类,实际你也就创建了一个自己的数据类型。所以这个类的实例都是相似的,但类彼此之间是有区别的(因此,不同类的实例自然也不可能相同了)。与其玩那些从玩具商那买来的玩具礼物,为什么不设计并创造你自己的玩具来玩呢?
类还允许派生。你可以创建一个子类,它也是类,而且继续了父类所有的特征和属性。从Python 2. 2开始,你也可以从内建类型中派生子类,而不是仅仅从其他类。
13.3.1 创建类
Python类使用class关键字来创建。简单的类的声明可以是关键字后紧跟类名:
本章前面的概述中提到,基类是一个或多个用于继承的父类的集合;类体由所有声明语句,类成员定义,数据属性和函数组成。类通常在一个模块的顶层进行定义,以便类实例能够在类所定义的源代码文件中的任何地方被创建。
13.3.2 声明与定义
对于Python函数来说,声明与定义类没什么区别,因为他们是同时进行的,定义(类体)紧跟在声明(含class关键字的头行[header line])和可选(但总是推荐使用)的文档字符串后面。同时,所有的方法也必须同时被定义。如果对OOP很熟悉,请注意Python并不支持纯虚函数(像C++)或者抽象方法(如在Java中),这些都强制程序员在子类中定义方法。作为替代方法,你可以简单地在基类方法中引发NotImplementedError异常,这样可以获得类似的效果。