[Python3] 內置修飾器@property

爲什麼要使用@property

需求如下:

  1. 我們希望對一個成員屬性的訪問加以限制,按照常規思路是寫一個或多個訪問函數來實現訪問修改等操作
  2. 如果我們仍然想通過屬性(變量)名來訪問屬性可不可以呢
  3. 答案是可以的,這裏Python提供了了一種很神奇的方案,名爲@property的函數修飾器

    直接上例子

class Student(object):
    __score = 0.0
    def __init__(self):
        pass

    @property       # 這樣一來就可以直接通過.score而不是.score()來訪問__score了
    def score(self):
        return self.__score

    # 這個時候@property會自動生成一個.setter裝飾器,這裏我們寫人@score.setter
    # 重載score方法,就可以通過.score來設置成員屬性,同時實現對屬性的修改限制

    @score.setter
    def score(self, value: float):
        if 0 <= value <= 100:
            self.__score = value
        else:
            raise ValueError


if __name__ == '__main__':
    stu1 = Student()
    stu1.score = 88.5
    try:
        stu1.score = 200
    except ValueError:
        print('ValueError')
    print(stu1.score)
  1. @property可以實現讓用戶直接通過成員方法名來調用成員方法,因此使用 stu1.score 可以直接得到 return 關鍵字後面返回的結果
  2. score方法使用了@property後,修飾器本身又創建了另一個修飾器@score.setter 從名字就可以看出來這個是用來賦值的
  3. 我們重載score方法,並使用@score.setter 修飾器,就可以用 =score賦值:stu1.score = 200(個人認爲這裏其實是重載了 = 運算符)

運行結果如下:

ValueError
88.5

另外,如果我們不使用@score.setter 而僅僅使用@property 可以讓一個屬性成爲‘只讀’屬性

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