首页 > 代码库 > 7.1.2封装

7.1.2封装

     封装是指向程序中的其他部分隐藏对象的具体实现细节的原则。听起来有些像多态,也是使用对象而不知道其内部细节,两者概念有些类似,因为他们都是抽象的原则,他们都会帮助处理程序组件而不用过多关心多余细节,就像函数做的一样。

但是封装并不等同于多态。多态可以让用户对于不知道是什么类(对象类型)的对象进行方法调用,而封装是可以不用关心对象是如何构建的而直接使用。听起来还是有些相似?让我们用多态而不用封装写个例子,假设有个叫做OpenObject的类(本章后面会学会如何创建类):>>> o = OpenObject() #This is how we create objects...

                                                                                       >>> 0.setName(‘Sir Lancelot‘)

                                                                                       >>>o.getName()

                                                                                      ‘Sir Lancelot‘

创建了一个对象(通过像调用函数一样调用类)后,将变量o绑定到该对象上。可以使用setName和getName方法(假设已经由OpenObject类提供)。一切看起来都很完美。但是假设o将他的名字存储在全局变量globalName中:

                       >>>globalName = ‘Sir Gumby‘

                      >>>o.getName()

                     ‘Sir Gumby‘

如果创建了多个OpenObject实例的话就会出现问题,因为变量相同,所以可能会混淆:

>>>01 = OpenObject()

>>>o2 = OpenObject()

>>>o1.SetName(‘Robin Hood‘)

>>>o2.getName()

‘Robin Hood‘

可以看到,设定一个名字之后,其他的名字也就自动设定了。这可不是想要的结果。

基本上,需要将对象进行抽象,调用方法的时候不用关心其他的东西,比如它是否干扰了全局变量。所以能将名字“封装”在对象内吗?没问题。可以将其作为特性(attribute)存储。

正如方法一样,特性是将作为变量构成对象的一部分,事实上方法可以更像是绑定在函数上的属性。

如果不用全局变量而是用特性重写类,并且重命名CloseObject,他会像下面这样工作:

>>>c = CloseObject()

>>>c.setName(‘Sir Lancelot‘)

>>>c.getName()

‘Sir Lancelot‘

目前为止还不错。但是值可能还是存储在全局变量中的。那么再创建另一个对象:

>>>r = CloseObject()

>>>r.setName(‘Sir Robin‘)

r.getName()

‘Sir Robin‘

可以看到新的对象的名称已经正确设置。这可能是我们期望的。但是第一个对象怎么样了呢?

>>>c.getName()

‘Sir Lancelot‘

名字还在!这是因为对象有了他自己的状态(state)。对象的状态由他的特性(比如名称)来描述。对象的方法还可以改变他的特性。所以就像是将一大堆函数(方法)捆在一起,并且给予它们访问变量特性的(特性)权力,他们可以在函数调用之间保持保存的值。

 

7.1.2封装