通过代码加深python上对于封装的理解,原本对于用户名和密码的设置,如果不做限制,容易出现问题,通过封装来对初试密码设置以及后续的变量修改和使用做出判断以及限制。
对内容进行保护,防止细节被破坏。
双下划线的成员名是要隐藏的,不能做调用。
class User:
def __init__(self, name='Noname', passwd='default'):
#此处两个实例变量以__开头,因此它会被隐藏
if isinstance(name,str) and 4 <= len(name) <= 8: #不仅对长度作出要求,也要求密码必须是字符串
self.__name = name
else:
self.__name = 'Noname'
if isinstance(name, str) and 6 <= len(passwd) <= 12:
self.__passwd = passwd
else:
self.passwd='default'
def getname(self):
return self.__name
def setname(self, name):
#封装的意义在于:当程序通过setter对实例变量赋值时,程序会对所赋值进行检查,避免无效值,程序可保证对象的完整性
if isinstance(name,str) and 4 <= len(name) <= 8: #要求姓名也必须是字符串
self.__name = name
else:
print('无效的用户名')
name=property(fget=getname,fset=setname)
def getpasswd(self):
return self.__passwd
def setpasswd(self, passwd):
if isinstance(passwd,str) and 6 <= len(passwd) <= 12: #不仅对长度作出要求,也要求密码必须是字符串
self.__passwd = passwd
else:
print('无效的密码')
passwd = property(fget=getpasswd, fset=setpasswd)
u = User()
#如果没有封装机制,u.name可以被赋值为任意内容。当使用封装之后,u.name只能设置为4-8位的字符串。
u.name = 'fk' #无效的用户名
print(u.name)
u.name = 'asdfj'
print(u.name)
python会偷偷地改变双下划线成员名,会在前面添加一个单下划线和类名,可以通过这种方式来达到调用的目的(虽然不建议这样做)。
class Item:
def __init__(self):
#被隐藏的__name变量
self.__name = '电子产品'
im = Item()
print(im.__name) #被隐藏,代码就会出错
这个时候对于__name是访问不到的,会提示错误。
代码修改成:
class Item:
def __init__(self):
#被隐藏的__name变量
self.__name = '电子产品'
im = Item()
# print(im.__name)
print(im._Item__name)
此时就可以访问到了,这就是python修改的成员名,前面增加了 _类名。python并没有真正的隐藏机制,所有成员默认都是公开的。
《疯狂python》学习笔记