2012-08-02 185 views
1

我已經做了很多的類的最近的Python和我通常只是訪問實例變量是這樣的:最佳實踐 - 訪問對象變量

object.variable_name 

但是,我常常看到,從其他模塊的對象會使包裝方法來訪問變量是這樣的:

object.getVariable() 

有什麼優勢/劣勢,這些不同的方法,是有公認的最佳實踐(即使有例外)?

回答

1

我認爲,「getters」(getVariable表單)的主要優點是添加功能或改進對象而不更改簽名要容易得多。例如,假設我的對象從實現某些功能變爲封裝另一個對象並通過代理模式(組合)提供相同的功能。如果我使用getter訪問屬性,那麼從何處獲取屬性並不重要,並且使用您的代碼不會對「客戶端」顯示任何更改。

我使用getters和這樣的方法,尤其是當我的代碼被重用(作爲一個庫的例子),由別人。當我的代碼是獨立的時候,我更沒有挑剔。

在Java中這幾乎是一個需求,你不應該直接訪問你的對象字段。在Python中這樣做是完全合法的,但是你可以考慮我提到的封裝的可能的好處。請記住,直接訪問是而不是在Python中被認爲是不良格式,恰恰相反。

+0

在Python中,當您從簡單屬性轉到getter/setter(使用@property裝飾器instad)時,不必更改API。在其他語言(Java,C++)中,這是一個有效的參數。有些人可能會爭辯說,這是一種糟糕的風格,沒有足夠明確/意外的行爲來做屬性訪問的工作。 – maxy 2012-08-02 11:22:06

9

Python中不應該有任何需要使用方法調用來獲取屬性。寫過這些的人可能是前Java程序員,這是慣用的。

在Python中,直接訪問屬性被認爲是正確的。 如果事實證明訪問屬性時需要運行一些代碼,例如動態計算它,則應使用@property裝飾器。

+0

@jonathan topf - 不,不是那個,這個! :-) – Ghopper21 2012-08-02 11:19:51

+0

你確實是這個問題的pythonic答案。我的答案更通用一些。你先生,有我的贊同。 – pcalcao 2012-08-02 11:25:10

+0

直接訪問以及getter/setter屬性的問題在於它成爲對象API並且經常公開其當前實現的內部工作。如果這些不太可能改變或沒有很多客戶,那很好,但是否則,許多人認爲這是一個糟糕的面向對象編程實踐。恕我直言屬性往往只是一個柺杖,隨着代碼開始發展,稍後會添加這些柺杖以使事情仍然有效,這種情況經常發生。 – martineau 2012-08-02 13:36:49

0

使getVariable()和setVariable()方法被稱爲包裝。 這種做法有很多優點,它是面向對象編程中的優先風格。

通過訪問通過方法的變量,您可以通過確保您嘗試設置/獲取的值是正確的,來添加另一層「錯誤檢查/處理」。

setter方法還用於其他任務,如通知偵聽器該變量已更改。

至少在java/c#/ C++等等。