Learning Python Part IV 之类和面向对象

来源:互联网 发布:ddos网络攻击 编辑:程序博客网 时间:2024/06/03 18:42

引言

我们写的代码都是以对象为基础的——我们在代码中不断的传递对象,在表达式中使用、调用它们的方法等。为了把我们的代码真正的面向对象object-oriented(OO),我们的对象也会参与称作inheritance hierarchy的东西。

类是一种用来在Python中实现支持继承的新类型的对象的代码结构。类是Python中的主要的面向对象编程(OOP)工具。OOP提供了一种完全不同的而且往往是更高效的编程方法,通过这种方法我们将代码冗余最小化,可以通过定制化已有代码的方式写新程序,并且并不会破坏已有代码。

在Python中,类通过新的语句创建:class。通过class定义的对象看起来和我们之前研究的内置类型很像。事实上,类只是我们之前传达的观点的应用和扩展;类被设计用来创建和管理新的对象,并且支持继承——一种代码定制化和重用的机制,和我们之前遇到的所有完全不同。

有一点需要提前说:在Python中,OOP并不是不可替代的,而是一个更优化的选择,它会使你的代码更优美,你并不需要一开始就使用类。你可以先用一些更简单的结构做大量的练习,例如函数或更简单的最高层级代码(top-level script code)。因为使用类需要一些从顶向下的设计,做一个更大的长时间的产品开发的人可能会比写一些简单代码的人更感兴趣。

尽管如此,类是Python提供的最有用的工具之一。如果使用得当,类能够从根本上缩短开发周期。所有类是一个很有用的工具,也可以在一些Python工具中例如 tkinterGUI API看到类的使用。

OOP的特性

记得之前说过程序就是”do things with stuff”?简单的讲,类就是定义新类型的stuff的一种方法。例如我们打算通过类实现一个披萨制作机器人 ,OOP的两个特性证明类很有用:

  • 继承:

    披萨制作机器人是一种机器人,所以他有robot-y属性。用OOP的话来讲,我们说他从普通的机器人继承了属性。这些常见的属性对常规的例子来讲只需要实现一次,将来我们打造其他任何类型的机器人的时候都可以被部分的或全部的重用。
  • 类组合(composition):

    披萨制作机器人可以说是所有一起协作的组件的集合体。例如,为了我们的机器人能够正常工作,它可能需要一个可以转动的胳膊,一个马达用来驱动等。用OOP的话说,我们的机器人就是一个composition的例子;它包含其他做不同事情的对象,每个组件都可以写成类的形式,定义自己的行为和属性。

类的特性

OOP的特点例如继承和类组合(composition)可以被应用到任何程序,只要程序能够被分解为一系列的对象。

从一个更具体的编程角度来看,类是Python的程序单元。就像函数和模块一样:类是打包逻辑和数据的另一种划分。事实上,类也定义新的命名空间,这和模块很像。但是与其它我们之前已经知道的程序单元相比,类有三个关键性的不同使类在创建新对象是更有用:

  • 多个实例(Multiple instances):

    类是产生一个或多个对象时很重要的工具。每次我们调用一个类,我们就产生了一个新的对象和完全不同的命名空间。每个由类产生的对象都有访问类的属性的权限和获得一个包含自己数据的命名空间,每个对象都不同。这和调用闭包函数很相似,但这是类的天性而且更明确,这也是类所做的其中一件事。类提供了一个完整的编程解决方法。
  • 通过继承定制化:

    类也支持OOP的继承概念;当以一个新的以子类的形式编写的软件组件时,在类之外通过定义属性的方式扩展类。更通俗的讲,类可以建立命名空间等级体系,,其中定义的名字会被继承类创建的对象使用。比起其他工具来说,类更直接的支持多样的定制化行为。
  • 操作符重载:

    通过提供特殊的协议方法,类定义的对象可以响应应用于内置类型的那一类操作符。例如,类定义的对象可以被切片、连接、索引等。Python提供了类可以使用的钩子函数,可以用来截获和实现任何的内置类型操作。

OOP的机制

Python中OOP的机制简单的说也就是两点:函数中的第一个特殊参数——为了获得调用的主体;属性继承搜索(inheritance attribute search)——为了支持定制化编程。其它的更深的讲,这个模型就是一个最终处理内置类型的函数。为了更好的支持编程,比起扁平化的程序化模型OOP只是增加了额外的一层结构。连同我们知道的函数化工具,在构建更加复杂的程序时,这代表了十分重要的抽象化步骤。