• python的@propert装饰器


    首先,@propert的作用是把类中的方法『变成』了属性,方便通过实例访问。propert可以有两种用法:可以把一个方法变成只读属性;可以对一些属性进行过滤。

     想象这样一个场景,在实例化一个类之后,需要对类的一个属性进行赋值,这时候是没有对属性属性被赋予的值进行判断的,如果属性被赋予了一个不合适的值,那么代码在后面执行的时候就会报错,为了避免这种情况,可以有两种方法解决。

    一:设置一个方法,对属性值进行判断:

    class Student():
    
        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

      
    if __name__ == '__main__':
    s = Student()
    s.set_score(value="88")
    print(s.get_score())

    再Student类中,为了避免直接对 _score 属性操作,我们提供了 get_score 和 set_score 方法,这样起到了封装的作用,把一些不想对外公开的属性隐蔽起来,而只是提供方法给用户操作,在方法里面,我们可以检查参数的合理性等。这样做没什么问题,但是我们有更简单的方式来做这件事。

    二:使用propert装饰器。

    class Teacher():
        @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
    if __name__ == '__main__':

    t = Teacher()
    t.score = 10
    print(t.score)
    t.score = 20
    print(t.score)

    在上面,我们给方法 score 加上了 @property,于是我们可以把 score 当成一个属性来用,此时,又会创建一个新的装饰器 score.setter,它可以把被装饰的方法变成属性来赋值。

    另外,我们也不一定要使用 score.setter 这个装饰器,这时 score 就变成一个只读属性了:

    class test():
        def __init__(self, s1):
            self.s = s1
    
        @property
        def f1(self):
            return self.s
    
    if __name__ == '__main__':
    
        t1 = test(s1=90)
        print(t1.f1)

    注意:最后面一行的print(t1.f1)不要加括号,print(t1.f1()),要不会报错'int' object is not callable

    参考文章:http://funhacks.net/explore-python/Class/property.html

    ****************不积跬步无以至千里。****************

  • 相关阅读:
    babel的使用及安装配置
    npm install卡顿问题
    盒模型
    安全性
    字符串方法
    vue
    CSS3
    重载运算符
    装箱拆箱
    模板库
  • 原文地址:https://www.cnblogs.com/liangshian/p/11985478.html
Copyright © 2020-2023  润新知