封装是面向对象的三大特征之一, 它指的是将对象的状态信息隐藏在对象内部,不允许外部程序直接访问对象内部信息,而是通过该类所提供的方法来实现对内部信息的操作和访问。对一个类或对象实现良好的封装,可以达到以下目的:
1、隐藏类的实现细节,即隐藏类中的变量、方法及具体实现等;
2、只能通过事先预定的方法来访问,从而可以在该方法里加入控制逻辑,限制对属性的不合理访问;
3、可进行数据检查,从而有利于保证对象信息的完整性;
4、便于修改,提高代码的可维护性。
总之实现一个良好的类封装,需要将类属性及实现细节隐藏起来,避免外部直接访问;通过提供可访问的具体方法让方法来控制对这些属性进行安全的访问和操作。
class User:
#隐藏方法
def __hide(self):
print(self.__name, self.__age)
#隐藏属性__name的getter和setter方法
def getname(self):
return self.__name
def setname(self, name):
if len(name) < 3 or len(name) > 8:
raise ValueError('名称请控制在3-8个字符')
self.__name = name
name = property(getname, setname)
#隐藏属性__age的getter和setter方法
def getage(self):
return self.__age
def setage(self, age):
if age < 18 or age > 45:
raise ValueError('年龄需要在18至45岁之间')
self.__age = age
age = property(getage, setage)
u = User()
u.name = 'Andy'#实际上调用了setname方法进行赋值
u.age = 30 #同样调用setage方法
print(u.name, u.age)
#u.__hide() #尝试调用隐藏方法会提示未知属性错误
#可以通过绕开隐藏的方式访问
#u._User__hide()
#print(u._User__name, u._User__age)
Python并不是真正的隐藏,只是用过双下划线的方式实现简单的隐藏,可以通过单下划线加类名再加双下划线隐藏属性的方式直接访问和修改(例如上面的name属性,可以直接u._User__name进行访问,但不推荐这样使用)。