天天看點

Python進階之“屬性(property)”詳解

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

将類方法轉換為隻讀屬性

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

在本文中,您将學習如何以幾種不同的方式來使用内置的屬性函數。希望讀到文章的末尾時,你能看到它是多麼有用。

使用屬性函數的最簡單的方法之一是将它作為一個方法的裝飾器來使用。這可以讓你将一個類方法轉變成一個類屬性。當我需要做某些值的合并時,我發現這很有用。其他想要擷取它作為方法使用的人,發現在寫轉換函數時它很有用。讓我們來看一個簡單的例子:

在上面的代碼中,我們建立了兩個類屬性:self.first_name和self.last_name。接下來,我們建立了一個full_name方法,它有一個@property裝飾器。這使我們能夠在python解釋器會話中有如下的互動:

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

這是一種限制,是以讓我們來看看另一個例子,其中我們可以建立一個允許設定的屬性。

讓我們假設我們有一些遺留代碼,它們是由一些對python了解得不夠好的人寫的。如果你像我一樣,你之前已經看到過這類的代碼:

要使用這個類,我們必須要使用定義的getter和setter方法​​:

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

我們在這段代碼的末尾添加了一行。現在我們可以這樣做:

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

上面的代碼示範了如何為fee屬性建立一個setter方法。你可以用一個名為@fee.setter的裝飾器裝飾第二個方法名也為fee的方法來實作這個。當你如下所做時,setter被調用:

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

現在你知道如何在你的類中使用python的屬性函數。希望你能找到更有用的方式,在你的代碼中使用它們。

<a target="_blank" href="http://eli.thegreenplace.net/2009/02/06/getters-and-setters-in-python/">python中的getter和setter方法</a>