2012-08-06 74 views
0

我有一個網絡應用程序,最初我用feedparser從我的博客中提取數據。現在我想用Google API來擴展各種其他功能。基於用戶輸入繼承課程

因爲我不想打破我的舊代碼,並要添加新的API作爲一個附加的插件式的東西,我想設置非常相似BeautifulSoup這樣的結構:它提供了一個選擇,選擇HTML/ XML解析器根據情況

BeautifulSoup(markup, "html.parser") 
BeautifulSoup(markup, "lxml") 
# They still support the same methods mentioned in the documentation. 

這是我做過什麼:

from apis import api1, api2 
from dev_user import my_api_choice 
select = { "api1" : api1, "api2": api2 } 

obj = pservice (select["my_api_choice"]) 
obj.method1() 
# invokes method1 of the inherited class. 

pservice非常接近包裹補課。我最初認爲寫它是因爲我可以有機會在其中使用Google API。我甚至確保api2(提供Google API功能)提供了與api1相同的方法(即使它們的方法名稱相同)。

那麼,這是一個很好的方法嗎?要不然,我怎麼能做到這一點的其他方式..

+2

「示例7.運行時的Metaclass配置」,位於本文第2頁[Python Metaclass編程入門](http://onlamp.com/pub/a/python/2003/04/17/metaclasses.html )顯示了用元類來做這件事。 – martineau 2012-08-06 20:41:10

+0

如果我正確理解這個問題 - 基本上你只是遵循[適配器模式](https://en.wikipedia.org/wiki/Adapter_pattern)。特別適合你的API的多個版本到一個 – 2015-12-08 15:49:11

回答

2

您可以創建一個abstract classAPI一些abstract法像fetchpullinherit,並建立在類的具體實現像API1/API2 /等..

例如實施fetch功能谷歌API將被做了HTML和同樣的方式fetch功能feedparser將使用XML實現...

現在根據您的要求或當前配置或任何輸入;作出一個決定,你想要使用API並且爲此創建dynamic instance,因爲方法名稱在所有類中都是相同的,所以只需觸發相應的function即可。

此外,您可以引入API3並更新您的配置 - 將API3類實例用作另一個content提供程序。

+0

這似乎是很好,但你能告訴我如何「動態」繼承一個特定的API ..在代碼上。我用了一個詞典來做到這一點。但是,有沒有其他方式或..它只是很好使用它 – Surya 2012-08-07 01:46:34

+1

去谷歌 - 你也應該檢查繼承通過deligation – shahjapan 2012-08-07 16:59:39

+0

這很有趣,它可能是我的問題的解決方案..但是,'BeautifulSoup'使用委派提供各種解析器? – Surya 2012-08-07 18:12:00