python中@property、@setter和@deleter

上一次我给大家讲解了装饰器,它能让函数在不做更多变动的情况下增加某些额外的功能

而今天我们来了解一下python中几个内置的装饰器




通常我们写代码的时候,都不希望外部代码能够轻易地修改内部属性的参数

因为要在外部改变参数的时候,我们必须想办法通过内部函数去检验参数的正确性,以确保设置正确

但是我们不让外部轻易地修改数据,反过来我们自己也不能很方便地从外部获取数据

那么,怎么样才能既在外部轻易地修改数据,又能很方便地获取到数据呢??


下面请看代码:

class Student():

    def __init__(self):            # 初始化
        self._score = None
        
    def get_score(self):           # 获得成绩
        return self._score

    def set_score(self, value):    # 设置成绩,并判断是否符合要求
        if value < 0 or value > 100:
            raise ValueError('score must between 0 ~ 100!')
        self._score = value

if __name__ == "__main__":
    s = Student()


_score(单“_”)完全可以看成是一个私有变量名,因为在模块与类外无法调用它

在这程序里我们不管设置成绩或者获取成绩,都得用最傻的办法,当然,我们也不能设置不合理的成绩值

如下图:



我们如果想直接把score绑定为Student的一个属性,方便来调用和赋值的话,就得这么修改:

class Student():

    def __init__(self):
        self._score = None
        
    def get_score(self):
        return self._score
    
    def set_score(self, value):
        if value < 0 or value > 100:
            raise ValueError('score must between 0 ~ 100!')
        self._score = value

    score = property(get_score, set_score)         # 将方法变为属性

if __name__ == "__main__":
    s = Student()

这时,我们确实可以操作s.score来操作内部的数据了



其实我们还有另外一种更好的办法,就是把一个getter变为@property,而@property本身又创建了另一个装饰器,这里是@score.setter,这样getter、setter方法都变为属性可以赋值调用了

(getter意为获得者,这里指get_score;setter意为设置者,这里指set_score)


修改后的代码如下:

class Student():

    def __init__(self):
        self._score = None
        
    @property
    def score(self):
        return self._score
    
    @score.setter
    def score(self, value):
        if value < 0 or value > 100:
            raise ValueError('score must between 0 ~ 100!')
        self._score = value

if __name__ == "__main__":
    s = Student()


这个程序里就不用特意写get_score和set_score了,@property已经分配好了,所以我们两个函数都可以叫score

这样我们就可以只通过s.score来方便地操作数据了,当然我们依旧不能取范围以外的值



最后我们再看@deleter,只要再写一个如下的函数,我们就可以通过del s.score来轻松删掉原来的值了

    @score.deleter
    def score(self):
        del self._score

最后我们总结一下:

@property定义只读属性,@setter定义可读可写属性,@deleter定义可读可写可删除属性


  • 16
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

姜亚轲

你花钱的样子真帅

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

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

打赏作者

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

抵扣说明:

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

余额充值