1.3 常用术语#1.3.1 抽象/实现#抽象指对现实世界问题和实体的本质表现,行为和特征建模,建立一个相关的子集,可以用于#描绘程序结构,从而实现这种模型。抽象不仅包括这种模型的数据属性,还定义了这些数据的接口。#对某种抽象的实现就是对此数据及与之相关接口的现实化(realization)。现实化这个过程对于客户#程序应当是透明而且无关的。#1.3.2 封装/接口#封装描述了对数据/信息进行隐藏的观念,它对数据属性提供接口和访问函数。通过任何客户端#直接对数据的访问,无视接口,与封装性都是背道而驰的,除非程序员允许这些操作。作为实现的#一部分,客户端根本就不需要知道在封装之后,数据属性是如何组织的。在Python 中,所有的类属#性都是公开的,但名字可能被“混淆”了,以阻止未经授权的访问,但仅此而已,再没有其他预防#措施了。这就需要在设计时,对数据提供相应的接口,以免客户程序通过不规范的操作来存取封装#的数据属性。#1.3.3 合成#合成扩充了对类的描述,使得多个不同的类合成为一个大的类,来解决现实问题。合成描述了#一个异常复杂的系统,比如一个类由其它类组成,更小的组件也可能是其它的类,数据属性及行为,#所有这些合在一起,彼此是“有一个”的关系。比如,RepairShop“有一个”技工(应该至少有一个#吧),还“有一个”顾客(至少一个)。#这些组件要么通过联合关系组在一块,意思是说,对子组件的访问是允许的(对RepairShop 来#说,顾客可能请求一个SmogCheck,客户程序这时就是与RepairShop 的组件进行交互),要么是聚合#在一起,封装的组件仅能通过定义好的接口来访问,对于客户程序来说是透明的。继续我的例子,#客户程序可能会建立一个SmogCheck 请求来代表顾客,但不能够同RepairShop 的SmogZone 部分进#行交互,因为SmogZone 是由RepairShop 内部控制的,只能通过smogCheckCar()方法调用。Python#支持上述两种形式的合成。# 1.3.4 派生/继承/继承结构#
派生描述了子类的创建,新类保留已存类类型中所有需要的数据和行为,但允许修改或者其它#的自定义操作,都不会修改原类的定义。继承描述了子类属性从祖先类继承这样一种方式。从前面#的例子中,技工可能比顾客多个汽车技能属性,但单独的来看,每个都“是一个”人,所以,不管#对谁而言调用talk()都是合法得,因为它是人的所有实例共有的。继承结构表示多“代”派生,可#以描述成一个“族谱”,连续的子类,与祖先类都有关系。# 1.3.5 泛化/特化#泛化表示所有子类与其父类及祖先类有一样的特点,所以子类可以认为同祖先类是“是一个”#的关系,因为一个派生对象(实例)是祖先类的一个“例子”。比如,技工“是一个”人,车“是一#个”交通工具,等等。在上面我们间接提到的族谱图中,我们可以从子类到祖先类画一条线,表示#“是一个”的关系。特化描述所有子类的自定义,也就是,什么属性让它与其祖先类不同。#1.3.5 多态#多态的概念指出了对象如何通过他们共同的属性和动作来操作及访问,而不需考虑他们具体的#类。多态表明了动态(又名,运行时)绑定的存在,允计重载及运行时类型确定和验证。# 1.3.6 自省/反射#自省表示给予你,程序员,某种能力来进行像“手工类型检查”的工作,它也被称为反射。这#个性质展示了某对象是如何在运行期取得自身信息的。如果传一个对象给你,你可以查出它有什么#能力,这样的功能不是很好吗?这是一项强大的特性,在本章中,你会时常遇到。如果Python 不#支持某种形式的自省功能,dir()和type()内建函数,将很难正常工作。请密切关注这些调用,还#有那些特殊属性,像__dict__,__name__及__doc__。可能你对其中一些已经很熟悉了!