封装(Encapsulation)是面向对象的三大特征之一(另外两个是继承和多态),它指的是将对象的状态信息隐藏在对象内部,不允许外部程序直接访问对象内部信息,而是通过该类所提供的方法来实现对内部信息的操作和访问。 就好比使用计算机,我们只需要使用计算机提供的键盘,就可以达到操作计算机的目的,至于在敲击键盘时计算机内部是如何工作,我们根本不需要知道。 封装机制保证了类内部数据结构的完整性,因为使用类的用户无法直接看到类中的数据结构,只能使用类允许公开的数据,很好地避免了外部对内部数据的影响,提高了程序的可维护性。总的来说,对一个类或对象实现良好的封装,可以达到以下目的:
为了实现良好的封装,需要从以下两个方面来考虑:
因此,实际上封装有两个方面的含义:把该隐藏的隐藏起来,把该暴露的暴露出来。 Python 并没有提供类似于其他语言的 private 等修饰符,因此 Python 并不能真正支持隐藏。为了隐藏类中的成员,Python 玩了一个小技巧:只要将 Python 类的成员命名为以双下画线开头的,Python 就会把它们隐藏起来。 例如,如下程序示范了 Python 的封装机制:
上面程序用到了 raise 关键字来抛出异常,关于 raise 关键字和异常的相关信息,后续章节会详细介绍。 上面程序尝试将 User 对象的 name 设为 fk,这个字符串的长度为“2”不符合实际要求,因此运行程序最后一行包含如下错误:ValueError:用户名长度必须在3-8之间 将最后一行代码注释掉,并在程序尾部添加如下代码:
fkit 上面程序还定义了一个 __hide() 方法,这个方法默认是隐藏的。如果程序尝试执行如下代码:
AttributeError:'User' object has no attribute 'hide' 最后需要说明的是,Python 其实没有真正的隐藏机制,双下画线只是 Python 的一个小技巧,Python 会“偷偷”地改变以双下画线开头的方法名,会在这些方法名前添加单下画线和类名。因此上面的 __hide() 方法其实可以按如下方式调用(通常并不推荐这么干):
示范隐藏的hide方法 通过上面调用可以看出,Python 并没有实现真正的隐藏。类似的是,程序也可通过为隐藏的实例变量添加下画线和类名的方式来访问或修改对象的实例变量。例如如下代码:
fk 总结Python 并没有提供真正的隐藏机制,所以 Python 类定义的所有成员默认都是公开的;如果程序希望将 Python 类中的某些成员隐藏起来,那么只要让该成员的名字以双下画线开头即可。即使通过这种机制实现了隐藏,其实也依然可以绕过去。 |
|
来自: 星光闪亮图书馆 > 《专题2、Python类和对象》