66 lines
2.7 KiB
Markdown
66 lines
2.7 KiB
Markdown
# 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 | 属性 | |