2011-10-09 37 views
2

我剛剛開始使用Python,並試圖找出使用類的正確方法。python類繼承的基本用法

我的程序目前有兩個類,分別叫做PlannerModelPlanner是模型不可知的,因爲它使用的任何Model呈現一致的界面。所以,看起來如果我想要有幾種不同的可用模型,它們都應該從繼承,以強制執行一致的接口。另外,一些Model類將共享功能。例如,單一代理模型可以模擬一個代理,而雙代理模型可以模擬兩個代理,每個代理的行爲就像單一代理。

所以 - 我應該如何實現這個/我需要什麼語言功能?

編輯:感謝您的反應速度讓我瞭解鴨類!那麼,如果我想重寫另一個Model的功能的子集,聽起來像我只會使用繼承? (和我的doubleAgent,我可能只是使用singleAgents爲類成員?)

我已經通過類似的標籤其他一些問題,採取一看,但他們似乎更關心的是語法,而不是設計選擇。我還查看了關於classes的官方Python文檔,但沒有找到我要找的內容。 (可能是因爲我不知道足夠認識它。)

回答

3

在Python中,您通常不會像在靜態類型語言中那樣使用與OOP完全相同的方法。具體而言,您實際上並不需要一個對象來實現特定的接口或從抽象基類等派生。相反,對象只需要能夠所需的操作。俗稱鴨子打字。如果它像鴨子一樣走路,然後像鴨子一樣說話,那麼所有的意圖和目的都是鴨子。

所以,只要決定你的對象需要什麼方法,並確保它們總是擁有它們。如果您希望在系統中的不同參與者之間共享實現,那麼您可以考慮類繼承。但是如果沒有,那麼你可能會實現不相交的類層次結構。

2

Python的優勢之一(以及許多人會認爲的弱點)是它不依賴編譯時類型檢查來強制實現接口。這意味着它是而不是需要一組對象從一個公共基類繼承以便具有相同的接口 - 它們仍然可以在任何函數中互換使用。這種行爲通常被稱爲duck typing。正如你所說,事實上,因爲Python是動態類型的,所以很難「強制實現一致的接口」。出於這個原因,像zope.interface這樣的東西已經創建。您在案例中從類中獲得的主要好處是代碼重用 - 如果所有Model類型都實現了一些常見行爲。爲了更進一步,如果您希望將第三方庫中的一些不相關的對象類型作爲Model使用,那麼您甚至可以執行所謂的"monkey patching" or "duck punching"以添加必要的代碼提供您的Model界面!

0

基本上,您在Python中的Classes上提供的鏈接將回答關於繼承的部分下的所有問題。 在你的情況只是定義一個名爲Model類,然後兩個子類:單一試劑UND doubleAgent:

class Model: 
    pass 

class singleAgent(Model): 
    pass 

如果你真的需要抽象類看一看到「抽象基類」 ES:http://docs.python.org/library/abc.html

+0

我很抱歉 - 我應該讓我的問題更清楚。我希望_why/when_在Python中使用OOP功能,而不一定_how_。如果我按照我的第一次猜測,我會結束一些嚴重的非Pythonic代碼,並且使自己的事情變得非常困難。 – user670416