在程序设计中,封装(Encapsulation)是对 object 的一种抽象,即将某些部分隐藏起来,在程序外部看不到,即无法调用(不是人用眼睛看不到那个代码,除非用某种加密或者混淆方法,造成现实上的困难,但这不是封装)。
要了解封装,离不开“私有化”,就是将类或者函数中的某些属性限制在某个区域之内,外部无法调用。
Python 中私有化的方法也比较简单,就是在准备私有化的属性(包括方法、数据)名字前面加双下划线。
举例如下:
__metaclass__ = type
class ProtectMe:
def __init__(self):
self.me = "zqs"
self.__name = "kivi"
def __python(self):
print("I love Python")
def code(self):
print("which language do you like")
self.__python()
if __name__ == '__main__':
p = ProtectMe()
print(p.me)
print(p.__name)
运行结果:
zqs
Traceback (most recent call last):
File "C:/zhu/python-pytorch/test4.py", line 18, in <module>
print(p.__name)
AttributeError: 'ProtectMe' object has no attribute '__name'
查看报错信息,告诉我们没有__name
那个属性。果然隐藏了,在类的外面无法调用。
用上面的方法,的确做到了封装。但是,我如果要调用那些私有属性,该怎么办?
可以使用property
函数。
class ProtectMe:
def __init__(self):
self.me = "zqs"
self.__name = "kivi"
@property
def name(self):
return self.__name
if __name__ == '__main__':
p = ProtectMe()
print(p.name)
从上面可以看出,用了@property
之后,在调用那个方法的时候,用的是p.name
的形式,就好像在调用一个属性一样,跟前面的p.name
的格式相同。