@property for Python

本文详细介绍了Python中@property装饰器的使用方法,包括如何通过@property将方法转变为类属性,简化对象属性的获取与设置过程,并确保数据的有效性验证。

@property

  • 解决的问题:

    • 调用方法像直接用属性一样直接简单。
  • 思路:

    • 将方法包安装成属性。
      • 即对def fun()方法进行包装。
Python内置的@property装饰器就是负责把一个方法变成属性调用的

==============================================

无@property

class Student(object):

    def get_score(self):
         return self._score

    def set_score(self, value):
        if not isinstance(value, int):
            raise ValueError('score must be an integer!')
        if value < 0 or value > 100:
            raise ValueError('score must between 0 ~ 100!')
        self._score = value
分析:
  • 一个get_score方法, 一个set_score方法
>>> s = Student()
>>> s.set_score(60) # ok!
>>> s.get_score()
60
>>> s.set_score(9999)
Traceback (most recent call last):
  ...
ValueError: score must between 0 ~ 100!

有@property

class Student(object):
    # AA处get
    @property
    def score(self):
        return self._score

    # BB处set
    @score.setter
    def score(self, value):
        if not isinstance(value, int):
            raise ValueError('score must be an integer!')
        if value < 0 or value > 100:
            raise ValueError('score must between 0 ~ 100!')
        self._score = value
分析:
  • 给score方法加上@property,self_score为实例的假私有属性。可能理解为:对score进行包装成Student的类属性。
  • 给score方法又加上@score.setter。可以理解为:对.score方法当做属性用时去执行BB处的代码。(一般先有属性,再去设置改变属性)
  • 把一个getter方法变成属性,只需要加上@property就可以了,此时,@property本身又创建了另一个装饰器@score.setter,负责把一个setter方法变成属性赋值,于是,我们就拥有一个可控的属性操作。
>>> s = Student()
>>> s.score = 60    # OK,实际转化为s.set_score(60)
>>> s.score         # OK,实际转化为s.get_score()
60
>>> s.score = 9999
Traceback (most recent call last):
  ...
ValueError: score must between 0 ~ 100!
结论:

装饰后可以直接使用s.score,s.score=scoreNo;而不像无装饰前s.get_score(),s.set_score(60)那样将【设置参数放在括号里去设置】和【方法()】访问。

以上:解决了调用方法像直接用属性一样直接用的问题,使使用起来更加简单。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值