• python中@property的使用


    在绑定属性时,如果我们将属性直接暴露在外面,就可能导致属性被任意修改,有时候这个是我们不希望看到的
    如:设置学生的成绩
    class Student(object):
        def __init__(self):
            self.score = 0
    #这个显然不符合属性的规范
    #std = Student()
    #std.score = 99999
    #print std.score
    #于是我们采用内部限制的方法来设定
     1 class Student2(object):
     2     def __init__(self):
     3         pass
     4 
     5     def get_score(self):
     6         return self._score
     7 
     8     def set_score(self, value):
     9         if not isinstance(value, int):
    10             raise ValueError('score must be an integer!')
    11         if value < 0 or value > 100:
    12             raise ValueError('score must between 0 ~ 100!')
    13         self._score = value
    14 
    15 
    16 std2 = Student2()
    17 std2.set_score(60)
    18 print std2.get_score() #60
    19 
    20 std2.set_score(99999)
    21 print std2.get_score()
    22 
    23 Traceback (most recent call last):
    24   File "/home/mywork/oldboy/practice/property.py", line 44, in <module>
    25     std2.set_score(99999)
    26   File "/home/mywork/oldboy/practice/property.py", line 35, in set_score
    27     raise ValueError('score must between 0 ~ 100!')
    28 ValueError: score must between 0 ~ 100!
    #但是,上面的调用方法又略显复杂,这就是需要应用@property
    #他的本质就是把一个getter方法变成属性
    #此时,@property本身又创建了另一个装饰器@score.setter,
    #负责把一个setter方法变成属性赋值,于是,我们就拥有一个可控的属性操作:
    看代码:
     1 class Student3(object):
     2 
     3     @property
     4     def score(self):
     5         return self._score
     6 
     7     @score.setter
     8     def score(self, value):
     9         if not isinstance(value, int):
    10             raise ValueError('score must be an integer!')
    11         if value < 0 or value > 100:
    12             raise ValueError('score must between 0 ~ 100!')
    13         self._score = value
    14 
    15 std3 = Student3()
    16 std3.score = 90
    17 print std3.score #90
    18 std3.score = 9000 #直接设置时就报错
    19 
    20 Traceback (most recent call last):
    21   File "/home/mywork/oldboy/practice/property.py", line 69, in <module>
    22     std3.score = 9000
    23   File "/home/mywork/oldboy/practice/property.py", line 63, in score
    24     raise ValueError('score must between 0 ~ 100!')
    25 ValueError: score must between 0 ~ 100!
  • 相关阅读:
    【剑指Offer】49把字符串转换成整数
    【剑指Offer】48不用加减乘除做加法
    【剑指Offer】47求1+2+3+...+n
    判断两个线段是否相交
    EM算法--原理
    理解KMP算法
    阿里校招笔试的一道逻辑题
    线性拟合之最小二乘方法和最小距离方法
    Oracle Net Manager 服务命名配置以及用PL/SQL 登陆数据库
    正则表达式总结
  • 原文地址:https://www.cnblogs.com/gide/p/6542108.html
Copyright © 2020-2023  润新知