3 回答

TA貢獻2065條經驗 獲得超14個贊
在像Java這樣的依賴getter和setter的語言中,除了他們說的話,他們不應該做任何事情,也不希望他們做任何事情-如果x.getB()除了返回邏輯屬性的當前值之外,什么都不做b,或者是否x.setB(2)做了任何事情,都將是令人驚訝的需要少量的內部工作才能獲得x.getB()回報2。
但是,對于這種預期行為沒有語言保證,即,以名稱開頭get或為方法的方法主體受到編譯器強制的約束,set而是由常識,社會習俗,“樣式指南”和測試決定。
具有屬性(包含但不限于Python的語言集)的語言中的x.b訪問行為和賦值行為與Java中的getter和setter方法完全相同:期望相同,同樣缺乏語言強制保證。x.b = 2
屬性的首個勝利是語法和可讀性。不得不寫,例如
x.setB(x.getB() + 1)
而不是顯而易見的
x.b += 1
要求向眾神報仇。在支持屬性的語言中,絕對沒有充分的理由迫使該類的用戶經歷這種拜占庭樣板的旋轉,從而不影響其代碼的可讀性。
具體來說,在Python中,使用屬性(或其他描述符)代替getter和setter還有一個更大的好處:如果并且當您重新組織類時,不再需要底層的setter和getter,則可以(無需破壞類的已發布的API)簡單地消除了這些方法和依賴于它們的屬性,從而使的類b成為普通的“存儲”屬性,x而不是通過計算獲得并設置了“邏輯” 屬性。
在Python中,直接(在可行的情況下)而不是通過方法進行操作是一項重要的優化,系統地使用屬性使您能夠在可行的情況下執行此優化(始終直接公開“正常存儲的屬性”,只有那些確實需要在訪問時進行計算的屬性)和/或通過方法和屬性進行設置)。
因此,如果您使用getter和setter代替屬性,那么除了會影響用戶代碼的可讀性之外,您還無償地浪費了機器周期(以及浪費在這些周期中計算機的能量;-),這也是沒有充分理由的任何。
您對屬性的唯一爭論是,例如“通常,外部用戶不會因分配而產生任何副作用”;但是您錯過了這樣一個事實,即同一用戶(使用Java等getter和setter普遍存在的語言)不會期望(可觀察到的)“副作用”由于調用setter而產生(或者對getter的影響更少) ;-)。它們是合理的期望,作為班級作者,您有責任嘗試并適應它們-無論是直接使用setter和getter還是通過屬性使用,都無濟于事。如果您的方法具有明顯的可觀察到的副作用,請不要將其命名為getThis,setThat也不要通過屬性使用它們。
該屬性“隱藏實現”的抱怨是沒有道理的全資:大部分都面向對象是有關實現信息隱藏-制造類負責提出一個邏輯接口與外部世界和內部實現它,因為它最能。就像屬性一樣,getter和setter是實現此目標的工具。屬性只是做得更好(使用支持它們的語言;-)。

TA貢獻1853條經驗 獲得超6個贊
這樣做的目的是讓您避免在實際需要時才編寫getter和setter。
因此,首先要編寫:
class MyClass(object):
def __init__(self):
self.myval = 4
顯然,您現在可以寫了myobj.myval = 5。
但是后來,您決定確實需要二傳手,因為您想同時做一些聰明的事情。但是您不需要更改所有使用您的類的代碼-因此您可以將setter包裝在@property裝飾器中,并且一切都可以正常進行。
添加回答
舉報