封装不是单纯意义的隐藏,封装数据的主要原因是保护隐私,封装方法的主要原因是隔离复杂度
封装分为两个层面
1.创建类和对象会分别创建二者的名称空间,我们只能用类名.或者obj.的方式去访问里面的名字,这本身就是一种封装
注意:对于这一层面的封装(隐藏),类名.和实例名.就是访问隐藏属性的接口
2.类中把某些属性和方法隐藏起来,或者定义为私有,只在类的内部使用,在类的外部无法使用,或者留下少量的接口(函数)供外部访问
无论是哪种层面的封装,都要对外提供好访问内部隐藏内容的接口
上述代码运行结果在图中可看到:
zhanglaoshi 30 English
hanmei 15 第二组
zhanglaoshi is teaching
hanmei is studying
接下来,把上述代码中的两个类中的某些属性隐藏。Python中私有化的方法也比较简单,即在准备私有化的属性(包括方法、数据)名字前面加两个下划线即可
上述代码在截图中可以看到56行代码调用报错:‘Teacher’这个类没有‘name’这个属性,说明隐藏属性后,再像以前那样访问对象内部的属性,就会返回属性错误。
所以属性隐藏后,我们怎么样才能访问其内部属性呢?
python对于这样的隐藏,有一些特点:1.类中定义的_X只能在内部使用,如self._X,引用的就是变形之后的结果。2.这种变形其实正是对外部的改变,在外部是无法通过_X这个名字访问到的。
事实上,python对于这一层面的封装,需要在类中定义一个函数。
这样在类的内部访问被隐藏的属性,在外部就可以使用了,而且这种形式的隐藏并没有真正意义上的限制从外部直接访问属性,知道了类名和属性名一样可以调用类的隐藏属性