首先了解一下Python面向对象中类型-实例和父类-子类的关系。下面的一些规则很有用。
当我们介绍许多不同的对象时,我们只用了两种关系(图4.1 关系):
- 是一类(is a kind of)(实线):面向对象里叫做特殊化(specialization),这种关系是说对于两个对象,一个对象(子类)是另一个(父类)的特殊版本。蛇是爬行动物的一类,它有爬行动物的全部特征,也有称其为蛇的特殊的特征。
用到的术语:subclass of, superclass of和superclass-subclass。
- 是一个实例(is an instance of)(虚线):即实例化。这种关系是说一个对象(实例)是由另一个对象(类型)限定的一个具体的例子。我有个宠物蛇名叫Squasher, Squasher就是蛇的一个实例。
用到的术语: instance of, type of, type-instance和class-instance。
注意在日常会话中,‘是一个’对上述两种关系都适用。Squasher是一条蛇, 蛇是一个爬行动物。不过在此我们用特定的术语来避免混淆。
图4.1关系
我们对第一种关系使用实线是因为相对于第二种关系它们之间更靠近。举个例子——如果有人被要求列举一个类似于’蛇’的单词,这个人可能会回答’爬行动物’。然而,如果要列举一个类似于’Squasher’的单词,则就不那么可能会说出’蛇’了。
在这里给出两条很有用的关系属性:
虚线向上规则(Dashed Arrow Up Rule) 如果X是A的实例,且A是B的子类,则X也是B的实例。 虚线向下规则(Dashed Arrow Down Rule) 如果B是M的实例,且A是B的子类,则A也是B的实例。
换句话说,虚线箭头一端可以向上移动到实线箭头,虚线箭尾可以向下移(分别如图4.2 关系的传递性中的2a和2b所示)。这些属性可以从父类-子类关系的定义得出。
图4.2 关系的传递性
运用虚线向上规则,我们可以从下述第一条陈述得到第二条:
Squasher是蛇的实例(或者说,Squasher的类型是蛇)。
Squasher是爬行动物的实例(或者说,Squasher的类型是爬行动物)。
先前我们说过一个对象有确定的一个类型。那Squasher怎么会有两个?注意虽然两条陈述都正确,但一条更加正确(事实上包含另一条)。也就是说:
Squasher.__class__是蛇(Python中,__class__属性指向对象的类型)。 isinstance(Squasher, 蛇)和isinstance(Squasher, 爬行动物)都为真。
对于父类-子类关系存在一条相似的规则。
实线结合规则(Combine Solid Arrows Rule) 如果A是B的子类,且B是C的子类,则A也是C的子类。
蛇是一类爬行动物,爬行动物是一类动物,因此蛇是一类动物。或者用Python的方式说:
蛇.__bases__是(爬行动物,)(__bases__属性指向一个包含对象父类的元组) issubclass(蛇, 爬行动物)和issubclass(蛇, 动物)都为真。
注意一个对象可能有多个基类。