@hpp157
2016-08-13T10:00:16.000000Z
字数 1581
阅读 1770
Python
这本书到目前为止,我们把精力集中在了使用Python的OOP工具:class 上。但是,OOP也有设计问题——那就是如何使用classes去设计有用的对象( modles useful objects)。本章会介绍一些OOP的核心概念,并且举出一些额外的比目前已经展示过的例子还要现实的例子
在这个过程中,我们会编写一些Python中常用的设计模式,比如继承,组合,委托,和工厂。我们也会研究一些类设计的概念,像伪私有属性,多重继承和有界方法(bound methods)。
有一点需要注意,这里提到的一些设计术语仅仅靠书里的解释是不够的,如果这些资料引起了你们的好奇心,我建议你们接下来浏览一些关于OOP设计或者设计模式的文章。我们将会明白Python会使许多传统的设计模式不那么重要
让我先预览下大致内容——Pthon的OOP实现可以总结为下面3点:
继承
Python中的继承是基于属性查找的(在 X.name表达式中)
多态
在X.method中,method的意义取决于X的类型
封装
方法和操作符实现行为,数据隐藏默认是一种惯例
到目前为止,你应该很好的掌握了Python中的继承,我们也已经多次谈到了Python中的多态;这主要是由于Python 没有类型声明,属性总是在运行时才进行解析,实现相同接口的对象是可自动互相交换的,客户端不需要知道实现它们调用的方法的对象是什么种类(don't need to know what sorts of objects are implementing the methods they call)
封装的意思在Python中打包——也就是把实现的细节隐藏在对象接口的后面。这并不是意味着强制的私有化,虽然可以用代码实现私有化,正如我们将要在后面的39章中学到的,封装是有效且有用的:它允许在实现一个对象接口的同时不影响该对象的用户
一些OOP语言把多态定义成基于参数类型的重载函数(overloading functions)。因为Python中没有类型声明,所以这种概念其实是行不通的。正如我们看到的,Python 中的多态基于对象接口,而不是类型。
如果你渴望你学习C++的日子,你可以尝试像下面这样通过参数列表进行重载方法:
class C:
def meth(self,x):
pass
def meth(self,x,y,z):
pass
这段代码会运行,因为def只是在类的作用域中把一个对象赋给了一个变量名,最后定义的函数方法meth,才是唯一会被保留(有效)的.(意思是在class C中,第一个meth会被第二个meth代替,只有最后一个meth有效,第一个meth白定义了)
如果确实被要求使用基于类型的选择,你可以用第四章和第九章的知识,或者第十八章介绍的参数列表工具
class C:
def meth(self,*args):
if len(args) ==1:
pass
elif type(arg[0]) == int:
pass
正常情况下你不该这样写,因为这不是Python的方式,正如第十六章描述的,你应该把你的代码写成只是预期的一个对象接口 ,而不是具体的数据类型。这样一来,不论现在还是以后,都可以在更多的类型和应用上使用:
class C:
def meth(self,x):
x.operation()
给特殊的操作使用特殊的方法名字也被认为是比较好的习惯,而不是依赖调用标记(无论你使用的是那种语言)
尽管Python的对象模型比较直白,但OOP中的大多数艺术在于我们组合类去实现程序的目标,下一节开始用类的这些优势写一个大的程序
我们已经深入的探索了继承的机制,但是现在我还是像向你举个关于继承是如何和模拟真实世界的关系的。从一个程序员的角度来看,继承是由