1. 程式人生 > 其它 >【進階06】【自學筆記】Python類的 property 屬性

【進階06】【自學筆記】Python類的 property 屬性

在之前的學習中,物件的屬性,我們都是通過把變數值賦值給物件本身來實現的。

>>> class Student:pass
...
>>>
>>> s = Student()
>>> s.name = "王炳明"
>>> s.age = 27

  

直接賦值會存在一個問題,就是無法對屬性值進行合法性較驗,比如我給 age 賦值的是負數,在業務上這種資料是不合法的。但上面那種寫法是無法檢查出來的。

>>> s.age = -27
>>> s.age
-27

為了實現屬性的合法性校驗,Python 引入的 property 屬性。

請看下面這段程式碼

class Student:
    @property
    def age(self):
        return self._age

    @age.setter
    def age(self, value):
        if 0 <= value <= 150:
            self._age = value
        else:
            raise ValueError("Valid value must be in [0, 150]")

  

此時再對 age 屬性進行賦值就會對 value 的值進行合法性檢查,小於 0 或者 大於 150 的都是不合法資料。

>>> s = Student()
>>> s.age = -27                     #函式改造成屬性。
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 10, in age
ValueError: Valid value must be in [0, 150]

  

由此我們知道了property,其實是 Python 中一個內建的裝飾器,它可以在新式類中把一個函式改造成屬性。

  • 當你讀取屬性值時,會進入被property裝飾的函式。

  • 當你對屬性進行賦值時,會進入被@xx.setter裝飾的函式。

  • 兩個裝飾器,一定是@property在前面,而@xx.setter在後

奔跑的蝸牛