8、隐藏与封装
Python 隐藏方式:将命名以双下划线开头
class Item:
def __init__(self):
self.__name = '电子产品'
im = Item()
print(im.__name)
AttributeError: 'Item' object has no attribute '__name'
分析:隐藏后无法直接访问。
隐藏本质:Python会“偷偷”的改变双下划线开头的成员名,会在这些成员名前添加单下划线和类名(可通过这种方式来调用“被隐藏”的成员,不建议)。
print(im._Item__name)
电子产品
示例:
class User:
# 构造方法中检查赋值
def __init__(self, name='Noname', passwd='default'):
if isinstance(name, str) and 4<=len(name)<=8:
self.__name = name
else:
print('用户名无效,未成功设置')
self.__name = 'Noname'
if isinstance(passwd, str) and 6<=len(passwd)<=12:
self.__passwd = passwd
else:
print('密码无效,未成功设置')
self.__passwd = 'default'
def getname(self):
return self.__name
# 检查用户名赋值,避免传入无效的值
def setname(self, name):
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('py','1')
print('-'*30)
print(u.name, u.passwd)
用户名无效,未成功设置
密码无效,未成功设置
------------------------------
Noname default
u = User('python','123456')
print('-'*30)
print(u.name, u.passwd)
------------------------------
python 123456
u.name = 'j'
print('-'*30)
print(u.name)
用户名无效,未成功设置
------------------------------
python
u.name = 'java'
print('-'*30)
print(u.name)
------------------------------
java
分析:若没有使用封装,u.name 和 u.passwd 可以被赋值为任意内容使用封装后,u.name 只能设置为 4~8 位的字符串,u.passwd 只能设置为 6~12 位的字符串。