73 属性

① 公开的数据成员可以在外部随意访问和修改,很难保证用户进行修改时提供新数据的合法性,数据很容易被破坏,也不符合类的封装性要求。解决这一问题的常用方法是定义私有数据成员,然后设计公开的成员方法来提供对私有数据成员的读取和修改操作,修改私有数据成员之前可以对值进行合法性检查,提高了程序的健壮性,保证了数据的完整性。

属性(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)

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我还记得那天

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值