我的任務是使用 OOP 創建一個程式,閱讀他們給我的有關此任務的檔案,我注意到許多使用此命名約定的代碼示例:
class User:
def __init__(self, x, y, z):
self.__x = x
self.__y = y
self.__z = z
@property
def x(self):
return self.__x
@property
def y(self):
return self.__y
@property
def z(self):
return self.__z
這是pythonic的方式嗎?我會改用普通屬性,如下所示:
class User:
def __init__(self, x, y, z):
self.x = x
self.y = y
self.z = z
我對 OOP 沒有太多經驗,所以也許我遺漏了一些東西,在第一個例子中,你有命名重整保護屬性,但我不知道為什么它甚至是必要的,就我所見對類屬性的修改只在每個類內部進行,而不是從外部進行。關于為什么第一個例子更有意義的任何想法?
uj5u.com熱心網友回復:
如果它是用于內部類使用的私有屬性,則實際上是 python 撰寫自己的類的方式,它被稱為私有名稱修改:
有關更多資訊,請參閱Python 語言參考:
私有名稱修改:當在類定義中以文本形式出現的識別符號以兩個或多個下劃線字符開頭且不以兩個或多個下劃線結尾時,它被視為該類的私有名稱。在為它們生成代碼之前,私有名稱被轉換為更長的形式。轉換插入類名,在名稱前面洗掉前導下劃線并插入一個下劃線。例如,出現在名為 Ham 的類中的識別符號 __spam 將被轉換為 _Ham__spam。此轉換與使用識別符號的語法背景關系無關。如果轉換后的名稱非常長(超過 255 個字符),則可能會發生實作定義的截斷。如果類名僅包含下劃線,則不進行任何轉換。
uj5u.com熱心網友回復:
這種模式:
class User:
def __init__(self, x, y, z):
self.__x = x
@property
def x(self):
return self.__x
如果你想公開x閱讀更有意義,但不希望人們不小心設定它。
你當然可以添加一個setter:
@x.setter
def x(self, value):
self.__x_was_set = True
self.__x = value
如果您需要設定屬性的一些副作用發生,這更有意義(我添加了一個帶有 的微不足道的__x_was_set,但它可以是任何東西并且非常復雜)。
如果您不需要,那么這樣做更有意義:
class User:
def __init__(self, x):
self.x = x
或者您甚至可以使用資料類:
@dataclass
class User:
x: str
(或您x當然需要的任何型別)
我發現來自 Java 或 C# 等語言的開發人員傾向于過度使用 getter/setter 模式,因為他們更習慣于使用這種模式。我想說的是,從 Python 的角度來看,更簡單、更具可讀性更好。更重要的是因為user.__x仍然可以讀取和設定,所以實際上沒有添加任何保護,只是添加了代碼。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/376236.html
上一篇:如何包含尚不存在的CPP檔案?
下一篇:按回傳型別多載函式?
