[Python3] 内置装饰器@property

为什么要使用@property

需求如下:

  1. 我们希望对一个成员属性的访问加以限制,按照常规思路是写一个或多个访问函数来实现访问修改等操作
  2. 如果我们仍然想通过属性(变量)名来访问属性可不可以呢
  3. 答案是可以的,这里Python提供了了一种很神奇的方案,名为@property的函数装饰器

直接上例子

class Student(object):
    __score = 0.0
    def __init__(self):
        pass

    @property       # 这样一来就可以直接通过.score而不是.score()来访问__score了
    def score(self):
        return self.__score

    # 这个时候@property会自动生成一个.setter装饰器,这里我们写人@score.setter
    # 重载score方法,就可以通过.score来设置成员属性,同时实现对属性的修改限制
    
    @score.setter
    def score(self, value: float):
        if 0 <= value <= 100:
            self.__score = value
        else:
            raise ValueError


if __name__ == '__main__':
    stu1 = Student()
    stu1.score = 88.5
    try:
        stu1.score = 200
    except ValueError:
        print('ValueError')
    print(stu1.score)
  1. @property可以实现让用户直接通过成员方法名来调用成员方法,因此使用 stu1.score可以直接得到 return关键字后面返回的结果
  2. score方法使用了@property后,修饰器本身又创建了另一个修饰器@score.setter从名字就可以看出来这个是用来赋值的
  3. 我们重载score方法,并使用@score.setter修饰器,就可以用 =score赋值:stu1.score = 200(个人认为这里其实是重载了 =运算符)

运行结果如下:

ValueError
88.5

另外,如果我们不使用@score.setter而仅仅使用@property可以让一个属性成为‘只读’属性

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值