第13章 面向对象编程(2)

13.2 面向对象编程

13.2.1 面向对象设计和面向对象编程的关系

在Python中,类和OOP都不是日常编程所必需的。尽管它从一开始设计就是面向对象的,而且结构上支持OOP,但Python没有限定或要求你在你的应用中写OO的代码。

13.2.3 *常用术语

1. 抽象/实现

抽象指对现实世界问题和实体的本质表现、行为和特征建模,建立一个相关的子集,可以用于描绘程序结构,从而实现这种模型。抽象不仅包括这种模型的数据属性,还定义了这些数据的接口。对某种抽象的实现就是对此数据及与之相关的接口的现实化(realization)。现实化这个过程对于客户程序应当是透明而且无关的。

2. 封装/接口

封装描述了对数据/信息进行隐藏的观念,它对数据属性提供接口和访问函数。通过任何客户端直接对数据的访问,无视接口与封装性都是背道而驰的,除非程序员允许这些操作。在Python中,所有的类属性都是公开的,但名字可能被“混淆”了,以阻止未经授权的访问,但仅此而已,在没有其他预防措施了。

3. 合成

合成扩充了对类的描述,使用多个不同的类合成一个大的类,来解决现实问题。

4. 派生/继承/继承结构

派生描述了子类的创建,新类保留已存类型中所有需要的数据和行为,但允许修改或者其他的自定义操作,都不会修改原类的定义。

5. 泛化/特化

泛化表示所有子类与其父类及祖先类有一样的特点,所有子类可以认为同祖先类是“是一个”的关系,因为一个派生对象(实例)是祖先类的一个"例子"。

6. 多态

多台的概念指出了对象如何通过他们共同的属性和动作来操作及访问,而不需要考虑他们具体的类。多态表明了动态(后来又称运行时)绑定的存在,允许重载及运行时类型确定和验证。

7. 自省/反射

自省表示给予你,程序员,某种能力来进行像“手工类型检查”的工作,它也被称为反射。这个性质展示了某对象是如何在运行期取得自身信息的。

13.3 类

类是现实世界的抽象的实体以编程形式出现。实例是这些对象的具体化。

类与函数的最大的不同在于你运行函数,而类会创建一个对象。类就像一个Python容器类型。

13.3.1 创建类

基类是一个或多个用于继承的父类的集合;类体由所有声明语句,类成员定义,数据属性和函数组成。类通常在一个模块的顶层进行定义,以便类实例能够在类所定义的源代码文件中的任何地方被创建。

13.3.2 声明与定义

对于Python函数来说,声明与定义类没什么区别,因为他们是同时进行的,定义(类体)紧跟在声明(含class关键字的头行[header line])和可选的文档字符串后面。同时,所有的方法也必须同时被定义。所以对OOP很熟悉,请注意Python并不支持纯虚函数(像C++)或者抽象方法(如在Java中),这些都强制程序员在子类中定义方法。作为替换方法,你可以简单地在基类方法中引发NotImplementedError异常,这样可以获得类似的效果。

你可能感兴趣的:(面向对象)