首頁  >  文章  >  後端開發  >  Python 中的裝飾器 Getter 和 Setter

Python 中的裝飾器 Getter 和 Setter

PHPz
PHPz原創
2024-08-06 03:46:531040瀏覽

Decorator Getters and Setters in Python

裝飾器的一種類型是屬性 getter 和 setter。這些裝飾器允許對類別實例中的變數進行受控存取。

屬性取得器和設定器專門設計用於物件導向程式設計中的屬性控制。它們與函數裝飾器不同,因為它們用於類別屬性(請在此處查看我關於函數裝飾器的帖子)。

函數裝飾器和屬性 getter 和 setter 裝飾器都使用可重複使用程式碼修改程式碼並使用“@”語法。它們都改變了程式碼的功能。

好吧,讓我們開始吧。

屬性 getter 和 setter 應用於類別中的方法來定義各種行為。 setter 將屬性設為值,getter 從類別中取得屬性。此屬性首先設定

讓我們來看一個例子,然後我們將其分解:

class Shoe:
    def __init__(self, brand = "Adidas", size = 9):
        self.brand = brand
        self.size = size
        self._condition = "New"

    @property
    def size(self):
        """The size property"""
        return self._size

    @size.setter
    def size(self, size):
        """size must be an integer"""
        if isinstance(size, int):
            self._size = size
        else:
            print("size must be an integer")

    def cobble(self):
        """Repairs the shoe and sets the condition to 'New'."""
        self.condition = "New"
        print("Your shoe is as good as new!")

    @property
    def condition(self):
        """The condition property"""
        return self._condition

    @condition.setter
    def condition(self, condition):
        self._condition = condition

讓我們來看看這段程式碼:

一些屬性(條件、大小)前的下劃線向開發者表明它們是私有的;它們特定於 Shoe 類的每個實例(每隻鞋,小寫)。

您可能會注意到條件和大小的實例化方式不同。 self._condition = "New" 表示鞋類的每個實例(或物件)都以「New」條件進行實例化。對size屬性也做同樣的事情,但是不寫成self._size = 9這樣會觸發setter屬性驗證,因為size需要是一個整數(這是一個稱為驗證的過程)。我們直接設定每個鞋物件的條件,而不是透過屬性 setter 和 getter 方法來運行它。

cobble 方法不需要裝飾器,因為它只是執行一個操作,而不是取得/設定每個鞋子物件的屬性。

讓我們對程式碼進行最後一項更改。例如,如果我們想確保 size 屬性以後不能改變怎麼辦?畢竟,鞋子的尺寸並不會真正改變,不是嗎?

我們可以使用 hasattr() 函數對每個鞋子物件執行檢查。它是否具有由“_size”的存在指示的私有大小屬性?如果是這樣,則無法更改。這是實現的程式碼:

 @size.setter
    def size(self, size):
        """size must be an integer and can't be changed once set"""
        if hasattr(self, '_size'):
            raise AttributeError("Can't change size once set")
        if isinstance(size, int):
            self._size = size
        else:
            raise ValueError("size must be an integer")

屬性 setter 和 getter 掌握起來有點困難,但一旦理解了,你就會像專業人士一樣編寫 Python 程式碼!

來源:

熨斗學校材料

以上是Python 中的裝飾器 Getter 和 Setter的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn