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

試運行:

>>> 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可以給函數動態加上功能?對於類的方法,裝飾器一樣起作用。

使用規則:

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

例如:

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...
點個贊再走吧

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章