① 公开的数据成员可以在外部随意访问和修改,很难保证用户进行修改时提供新数据的合法性,数据很容易被破坏,也不符合类的封装性要求。解决这一问题的常用方法是定义私有数据成员,然后设计公开的成员方法来提供对私有数据成员的读取和修改操作,修改私有数据成员之前可以对值进行合法性检查,提高了程序的健壮性,保证了数据的完整性。
② 属性(property)是一种特殊形式的成员方法,结合了公开数据成员和成员方法的优点,既可以像成员方法那样对值进行必要的检查,又可以像数据成员一样灵活地访问。
③ 如果设置属性为只读,则无法修改其值,也无法为对象增加与属性同名的新成员,当然也无法删除对象属性。
class Test:
def __init__(self, value):
self.__value = value # 私有数据成员
@property # 修饰器,定义属性,提供对私有数据成员的访问
def value(self): # 只读属性,无法修改和删除
return self.__value
test = Test(3)
print(test.value)
# 只读属性不允许修改其值
# AttributeError: can't set attribute
# test.value = 5
# 试图删除对象属性,失败
# AttributeError: can't delete attribute
# del test.value
# 把属性设置为可读、可修改,而不允许删除
class Test:
def __init__(self, value):
self.__value = value
def __get(self): # 读取私有数据成员的值
return self.__value
def __set(self, v): # 修改私有数据成员的值
self.__value = v
value = property(__get, __set) # 可读可写属性,指定相应的读写方法
def show(self):
print(self.__value)
test = Test(3)
print(test.value) # 允许读取属性值
test.value = 5 # 允许修改属性值
print(test.value)
test.show() # 属性相应的私有变量也得到相应的修改
class Test:
def __init__(self, value):
self.__value = value
def __get(self):
return self.__value
def __set(self, v):
self.__value = v
def __del(self): # 删除对象的私有数据成员
del self.__value
value = property(__get, __set, __del)
def show(self):
print(self.__value)
test = Test(64)
test.show()
print(test.value)
test.value = 128
test.show()
print(test.value)
del test.value
# AttributeError: 'Test' object has no attribute '_Test__value'
# test.show()
# AttributeError: 'Test' object has no attribute '_Test__value'
# print(test.value)