python中@property与Descriptor的使用方法

        Python中的@property与Descriptor的方法可以为属性添加约束或进行参数检查, 方便简洁, 而网络上的介绍相对较为杂乱, 本文对它们做一个清晰的梳理.


一. 典型例子:

        我们通常使用类定义一些实体, 比如学生成绩(0~100分):

class student(object):
    def __init__(self, score):
        self.score = score
        有了类定义, 老师可以方便的录入每位学生成绩, 但有一个很大的缺陷: 程序允许录入负数, 或超过100的分数. 为了解决这个问题, 有一个简单的解决方案:

class student(object):

    def __init__(self, score):
        if not isinstance(score, int):
            raise ValueError('score must be an integer')
        if score < 0 or score > 100:
            raise ValueError('score must between 0~100')
        self.score = score
        这样一来, 如果成绩录入为非整数或者不在0~100分之间的成绩时, 程序提示ValueError. 可是如果使用者要进行成绩修改, 函数__init__中的限制将不起任何作用, 成绩还是可能被修改为不正确的值.

Jack = Student()
Jack.score = 9999

        这类问题称为参数检查问题, 解决这类问题, 有几种方法, 本文将由浅入深一一介绍.


二. 私有属性+类方法

        程序可以通过属性访问限制与类方法相结合的方式解决问题:

class student(object):

    def get_score(self):
        return self.__score

    def set_score(self, score):
        if not isinstance(score, int):
            raise ValueError('score must be an integer')
        if score < 0 or score > 100:
            raise ValueError('score must between 0~100')
        self.__score = score

        实例变量名如果以__开头,就变成了私有变量, 外部不能直接访问(系统讲变量名进行了修改变为了_student__score), 只能通过类方法的方式访问或修改属性. 如此无论是初始化还是成绩修改都必须经过参数检查.


三. @property

        通过以上方案虽然解决了问题, 但调用类方法丢失了操作的便捷性, 并且如果有其他属性也要做检查时, 要重新定义这些方法, 代码将臃肿不堪. Python提供了一种装饰器的方法, 可以对类动态的添加功能. @property便可以把函数调用伪装成属性的访问, 这样既进行了参数检查, 又可以方便的调用或修改属性值.

class student(object):

    @property
    def score(self):
        return self._score

    @score.setter
    def score(self, score):
        if not isinstance(score, int):
            raise ValueError('score must be an i
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值