Setters Getters Properties

為了資料封裝,有時你希望擁有一個屬性,該屬性值來自其他屬性,或者通常,此時應計算哪個值。處理這種情況的標準方法是建立一個名為 getter 或 setter 的方法。

class Book:
    def __init__(self, title, author):
        self.title = title
        self.author = author

在上面的例子中,如果我們建立一個包含標題和作者的新書,很容易看出會發生什麼。如果我們要新增到圖書館的所有圖書都有作者和標題,那麼我們可以跳過 getter 和 setter 並使用點符號。但是,假設我們有一些沒有作者的書籍,我們想將作者設定為未知。或者,如果他們有多位作者,我們計劃返回一份作者列表。

在這種情況下,我們可以為 author 屬性建立一個 getter 和 setter。

class P:
    def __init__(self,title,author):
        self.title = title
        self.setAuthor(author)

    def get_author(self):
        return self.author

    def set_author(self, author):
        if not author: 
            self.author = "Unknown"
        else:
            self.author = author

不建議使用此方案。

一個原因是有一個問題:我們假設我們已經使用 public 屬性設計了我們的類,沒有方法。人們已經使用了很多,他們編寫了這樣的程式碼:

>>> book = Book(title="Ancient Manuscript", author="Some Guy")
>>> book.author = ""  #Cos Some Guy didn't write this one!

現在我們遇到了問題。因為作者不是屬性! Python 提供了一個稱為屬性的問題的解決方案。獲取屬性的方法在其標題之前使用 @property 進行修飾。我們想要用作 setter 的方法在它之前用 @ attributeName.setter 進行修飾。

記住這一點,我們現在有了新的更新類。

class Book:
    def __init__(self, title, author):
        self.title = title
        self.author = author

    @property
    def author(self):
        return self.__author

    @author.setter
    def author(self, author):
        if not author: 
            self.author = "Unknown"
        else:
            self.author = author

請注意,通常 Python 不允許你使用具有相同名稱和不同數量引數的多個方法。但是,在這種情況下,Python 允許這樣做,因為使用了裝飾器。

如果我們測試程式碼:

>>> book = Book(title="Ancient Manuscript", author="Some Guy")
>>> book.author = ""  #Cos Some Guy didn't write this one!
>>> book.author 
Unknown