python3xiaobaike_2020/chapter7/7-5 python3小白课:封装和隐藏.md
2025-04-20 23:22:14 +08:00

66 lines
2.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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 | 属性 |