天天看點

python3 -屬性(property)

Python中有一個被稱為屬性函數(property)的小概念,它可以做一些有用的事情。在這篇文章中,我們将看到如何能做以下幾點:

将類方法轉換為隻讀屬性

重新實作一個屬性的setter和getter方法

正如你所看到的,因為我們将方法變成了屬性,我們可以使用正常的點符号通路它。但是,如果我們試圖将該屬性設為其他值,我們會引發一個AttributeError錯誤。改變full_name屬性的唯一方法是間接這樣做:

如果你想添加可以使用正常點符号通路的屬性,而不破壞所有依賴于這段代碼的應用程式,你可以通過添加一個屬性函數非常簡單地改變它:

正如你所看到的,當我們以這種方式使用屬性函數時,它允許fee屬性設定并擷取值本身而不破壞原有代碼。讓我們使用屬性裝飾器來重寫這段代碼,看看我們是否能得到一個允許設定的屬性值。

把一個getter方法變成屬性,隻需要加上@property就可以了,此時,@property本身又建立了另一個裝飾器@score.setter,負責把一個setter方法變成屬性指派

如果你看屬性函數的說明,它有fget, fset, fdel和doc幾個參數。如果你想對屬性使用del指令,你可以使用@fee.deleter建立另一個裝飾器來裝飾相同名字的函數進而實作删除的同樣效果。

在實作一個property的時候,底層資料(如果有的話)仍然需要存儲在某個地方。 是以,在get和set方法中,你會看到對 _first_name 屬性的操作,這也是實際資料儲存的地方。 另外,你可能還會問為什麼 init() 方法中設定了 self.first_name 而不是 self._first_name 。 在這個例子中,我們建立一個property的目的就是在設定attribute的時候進行檢查。 是以,你可能想在初始化的時候也進行這種類型檢查。通過設定 self.first_name ,自動調用 setter 方法, 這個方法裡面會進行參數的檢查,否則就是直接通路 self._first_name 了。