发表日期: 标签: OOP / Python

为何使用类:

使用类不仅仅是为了代码重用,它提供了描述现实世界问题结构和它们之间关系的非常有用的模型。包括两个方面:继承和组合。

我们的知识很大一部分是建立在分类的层次结构之上:将现实世界按各种规则分门别类的分解剖析。掌握之后又通过各种需要组合起来,反过来进一步理解这个世界,产生我们的智慧。

具体到类

  • 它是一种定义新种类的方式。
  • 从程序设计角度看,它又和函数和模块相似——是封装逻辑和数据的另一种方式。
  • 同时类也定义新的命名空间,这点和模块很像。
  • 它有和其它程序组成单元相比有三个显著的特点:
    • 多重实例:类好比是有个模具,每次调用类都会建立一个有自己命名空间的新对象,这个对象能够读取类的属性,并有自己的命名空间来存储自己的数据。
    • 继承:通过继承机制,类建立命名空间的层次结构,可以在这个层次结构中重新定义类的属性从而扩展类。
    • 运算符重载:类通过特定的协议方法,可以定义对象来响应内置类型上的几种运算。

相比C++和Java,Python 的OOP得到了简化。在Python中大多数OOP都可以简化为一个表达式:object.attribute。 当我们使用object.attribute这个表达式读取类的属性,调用对象的方法时,会产生一个动作——启动搜索对象连接树:从下到上,从左到右地搜索对象树,找到这个attribute首次出现的对象。

也就是说,取出一个属性就是简单地搜索一颗“树”。这个搜索过程(机制)就是称为:继承。

搜索是从下到上的,所以在树中位置较低的对象就重写了位置较高对象的相同属性。这个就是继承和重载的关键点。

在 Python 对象模型中,类和通过类产生的实例是两种不同的对象类型。每种类型的主要用途都是用来作为另一个类型的命名空间。

当你调用类创建一个实例时发生的:i=C() 实际执行的是 C.init(i); 当调用类的方法时 i.w(),实际执行的是 C.w(i)。(调用 C 类的 w 方法函数处理 i)

也就是说,每当我们调用类的方法时,总会隐含这个类的实例,Python 会把隐含的实例传进方法中的第一个特殊的参数,一般称之为 self。所以方法可以通过两种形式调用:i.w() 或者 C.w(i)。后一种方式实际上是你自己手工完成了搜索继承链和传入对象实例执行方法函数这两个步骤。

小结

Python的OO内容差不多就是:关于self的一个参数,和查找连接对象树中的属性,我们将这种查找称之为继承搜索。这种功能(搜索机制)可以让我们通过定制代码,合理使用可以大幅提高我们的编码效率。


留言和评论: