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