Python - @property 方法变属性

@property

  • @property是内置的装饰器,与普通装饰器原理是同样的,只不过返回的不是函数,而是类对象.
  • @property负责把一个方法变成属性进行调用,保证对参数进行必要的检查。
  • 属性有三个装饰器:settergetterdeleter。当属性只有getter方法,则为只有只读属性。不然为可读写属性。

定义一个类:函数

class Student(object):
     def __init__(self,score):
         self.__score = score      ## __score 翻译成 _Student__score
    
     # 容许外部代码获取score
     def get_score(self):
         print('%s'%self.__score)
         return self.__score

上述例子中,在绑定属性的时候,直接把属性暴露出去,致使能够随意修改,可是对score的修改又没有作校验限制等。
为了限制属性,例如score的范围,能够经过一个set_score()方法来设置成绩,再经过一个get_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:         # 输入的int数据,判断输入的范围
            raise ValueError('score must between 0 -100 ')
        self.score = value

试运行:code

>>> s = Student()            # 不须要s=Student(60),由于没有init方法
>>> s.set_score (60)
>>> s.get_score()
60
>>> s.set_score(101)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 8, in set_score
ValueError: score must between 0 -100

因此,有没有既能检查参数,又能够用相似属性这样简单的方式来访问、判断类的变量呢?
是否还记得装饰器decorator能够给函数动态加上功能?对于类的方法,装饰器同样起做用。对象

使用规则:get

  • 只读属性:只有getter方法,在方法前加上@property;
  • 可读可写属性:有getter和setter方法,在setter方法上使用@属性名.setter。

例如:it

class Student(object):
   # score:可读可写属性, getter与setter方法

   # 把一个getter方法变成属性,只须要加上@property就能够了
   @property
   def score(self):
       return self._score

   # 建立另外一个装饰器@score.setter,负责把一个setter方法变成属性赋值
   @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

   # 定义只读属性,只定义getter方法
   @property
   def age(self):
        return self._age

❤ thanks for watching, keep on updating...
点个赞再走吧ast

相关文章
相关标签/搜索