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