2016-08-30 34 views
0

定義/訪問指向對象的類中成員變量的方法的正確方法是什麼?訪問指向對象的類中成員變量的方法的正確方法是什麼?

例如,我有一個類Foo,有一個方法foo_method:現在

class Foo: 
    def foo_method(self): 
     return 'bar' 

,另一類Bar,我想一個對象存儲這個類(我不想Bar到繼承Foo)。

什麼是定義類Bar的正確/推薦的方法?

class Bar: 
    def __init__(self): 
     self.foo = Foo() 

# OR 

class Bar: 
    def __init__(self): 
     self.foo = Foo() 

    def bar_method(self): 
     return self.foo.bar() 

前者將允許我使用:

x = Bar() 
x.foo.foo_method() 

但是,這個我直接訪問一個成員變量(強耦合)的方法。

我用這種方法看到的好處是:

  • 我沒有來包裝被添加到Foo類中的每個新方法。
  • Bar可能包含更多指向其他類的成員變量。不包括 包裝他們保持Bar更小和可管理的大小。
  • 從IDE(PyCharm等)或IPython中的自動補全功能幫助 檢查bar像後面的子菜單 (x.foo.foo_method()x.bar.foobar()等),使其更容易開發代碼菜單(x.foo)。
  • 函數式編程的外觀正感覺(不知道這一個贊成或反對)

的缺點是強耦合,不封裝的foo內部細節等

我想檢查這是一個推薦的做法? 和/或是否有任何與此相關的指導方針(實施複合模式)?

任何輸入/指針將高度讚賞!

+0

我發現你的問題有點難以遵循,因爲有許多實體標記爲「酒吧」(手揮動的Foo類與酒吧方法返回「酒吧」,然後更具體的酒吧類定義,一個尚未另一個條形法)。一點消歧會讓你的問題更清晰恕我直言。 – Erik

+0

謝謝埃裏克。我已經更新了這個問題,並試圖使其更清楚。 – Sharad

+0

這讀起來好多了,謝謝。至於你的問題,對我來說這是一個意見和目標受衆的問題。如果您相信您的調用者知道要做什麼Foo()對象,只需將它們傳給Foo()即可。如果狀態欄保持不變,那麼您將不能複製Foo界面以確保其正確使用。 – Erik

回答

2

有沒有真正的指導方針,但如果你做一個bar_method(),明確地呼籲foo.bar()並沒有做任何事情之間它是完全相同的耦合和不太方便。

Python的成語包括「We are all responsible users」,在這種情況下,當封裝不能提供任何好處時,我個人不會使用代理函數。將它保留下來會導致較小的代碼更易於維護並且更易於訪問。您提到的自動完成只是額外的好處。

相關問題