2013-02-24 156 views
5

我想在Python 3.2中設置具有「受保護」訪問權限的類層次結構:基類的成員僅在派生類的範圍內,但不在「公共」範圍內。Python中的「受保護」訪問 - 如何?

雙下劃線使會員成爲'私人',單個下劃線表示警告,但會員保持'公開'。什麼(如果有...)是指定「受保護」成員的正確語法。

+6

不可以。使用'_single_underscore'約定,並開心。 – JBernardo 2013-02-24 06:42:32

回答

8

Python中的成員訪問權限由「協商」和「條約」進行,而不是強制執行。

換句話說,你班上的用戶應該把他們的手從他們的業務中解脫出來,但除了我使用的_xxx標識符之外,你不能強制執行這些標識符,這使得他們的訪問(通常)不適合。

+0

所以這是不可能的。好。但是,我確實遇到過無數次「條約」而不是「強制」的問題:訪問說明符背後的想法並不是真的阻止其他人做出某些事情。這是關於清晰,結構化的代碼組織。我希望我的語言能夠幫助我做到這一點,不會留下任何類似瘋狂黑客的開頭,這在我經常看到的Python代碼中都很常見。 (表明我可能不應該使用Python ...) – Vector 2013-02-24 08:17:12

3

雙下劃線不會在C++或Java意義上使會員成爲'私人' - Python完全避免了這種語言強制的訪問規則。一個單個下劃線按照慣例將一個屬性或方法標記爲「實現細節」 - 也就是說,外面的東西仍然可以實現,但這不是類接口的支持部分,因此,類可能對不變量或後退/前向兼容性的保證不再適用。這以不同的方式解決了與「私人」(界面和實施分離)相同的概念問題。

雙下劃線調用名字改編這還不是「私人」 - 它只是一個上面,由此略強配方: - 這個函數是這個類的實現細節, - 子類可能合理期望具有相同名稱的方法意味着作爲原

的重寫版本這需要的語言支持一點點,從而使__name的錯位,以包括類的名稱 - 以便它的子類版本獲得不同的名稱而不是重寫。如果子類或外部代碼真的想要調用該方法,那麼它仍然很有可能 - 並且名稱修改的目標明確爲而不是以防止這種情況發生。

的,因爲這一切不過,「保護」被證明不是太大的意義在Python - 如果你真的有可能打破不變除非子類調用(和方法,實事求是,你可能不要即使你認爲你也這麼做),Python方法只是爲了記錄它。在你的文檔字符串中加上一個註釋,說明「假定只能由子類調用」,並假設客戶會做正確的事情 - 因爲如果他們不這樣做,這就成爲他們自己的問題。

+0

'雙重下劃線在C++或Java意義上不會成爲'私有'......' - 理解。這就是爲什麼用引號說'私人'。但謝謝你的複習。 – Vector 2013-02-24 08:11:02