美文网首页
使用 @property

使用 @property

作者: SingleDiego | 来源:发表于2018-03-26 14:20 被阅读17次

    在绑定属性时,如果我们直接把属性暴露出去,虽然写起来很简单,但是,没办法检查参数,导致可以把成绩随便改:

    s = Student()
    s.score = 9999
    

    这显然不合逻辑。为了限制 score 的范围,可以通过一个 set_score() 方法来设置成绩,再通过一个 get_score() 来获取成绩,这样,在 set_score() 方法里,就可以检查参数:

    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
    

    但是,上面的调用方法又略显复杂,没有直接用属性这么直接简单。

    有没有既能检查参数,又可以用类似属性这样简单的方式来访问类的变量呢?Python 内置的 @property 装饰器就是负责把一个方法变成属性调用的:

    class Student(object):
    
        # __slots__ = ('name', 'score')
         
        def __init__(self, name, score):
            self.name = name
            self.score = score
    
        @property
        def score(self):
            return self._score
    
        @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
    

    测试一下:

    >>> bart = Student('bart', 60)
    
    >>> bart.score
    60
    
    >>> bart.score = 1000
    ......
    ValueError: score must between 0 ~ 100!
    

    加上 @property 可以把一个 getter 方法变成属性,而 @property 本身又创建了另一个装饰器 @score.setter,负责把一个 setter 方法变成属性赋值。

    相关文章

      网友评论

          本文标题:使用 @property

          本文链接:https://www.haomeiwen.com/subject/jzkrcftx.html