# python3小白课:封装和隐藏 封装(Encapsulation)是面向对象的三大特征之一,它将对象的状态信息隐藏在对象内部,不允许外部程序直接访问对象内部信息,而是通过该类所提供的方法来实现对内部信息的操作和访问。 我们在上一节课的小案例中可以通过property函数来实现小小的封装和隐藏,让某些实例变量的设定和获取可以通过特定的方法进行。 但仅仅是这样隐藏还是不够的,这节课咱们来教大家黑科技,那就是说可以在实例变量或者实例方法前面加两个`_`也就是`__`就可以实现变量或者方法的隐藏。 我们来看个例子: ```python # coding:utf-8 class Student: def __hide(self): print("我是隐藏的方法,你能调用我吗?") def getname(self): return self.__name def setname(self, name): print("进行了设置") self.__name = name this_name = property(getname, setname) s = Student() s.this_name = "小白白" print(s.this_name) s.__name = "小黑黑" print(s.this_name) print(s.__name) ``` 在这个例子中,我们设定了一个隐藏方法(这个后面讲),然后我们发现即使修改隐藏变量`__name`的值,`this_name`属性的值也不会被修改。 其实我们只需要关注this_name这个属性就好了,它的好处显而易见,那就是可以保证对于这个属性的修改是安全的,可以在赋值的时候增加一些逻辑控制。 好了,接下来我们再尝试一下在上述代码的基础上添加如下代码: ```python s.__hide() ``` 运行后发现报错:`AttributeError: 'Student' object has no attribute '__hide'`。 这意思就是说找不到这个方法,这个方法明明叫做这个呀,为什么报错呢? 这就是因为它被隐藏了!不能被直接调用。这也被称为变为类的私有方法。 但真的想调用怎么办?其实也是有办法的。 我们只需要改成这样: ```python s._Student__hide() ``` 即可正常调用了。仔细研究一下,其实这是python设计者跟我们玩的一个小把戏,调用这种隐藏的方法的时候,需要在方法名前面,还加上一个`_`下划线和类名,比如我这里的`_Student`,再接上方法名即可。 从上述的表达我们可以知道,在python的类中其实也没有提供真正的隐藏机制(变成私有方法的机制),所有成员都是默认公开的,但能有这个小把戏也挺好的,不是么? ### 单词释义 | 单词 | 释义 | | -------------- | -------- | | hide | 隐藏 | | AttributeError | 属性错误 | | attribute | 属性 |