2014-03-18 25 views
0

我已經在一個單獨的文件中使用Python構建了一個模塊,而不使用類。我這樣做,以便使用一些API模塊變得更容易。基本上是這樣的:Python抽象模塊可能嗎?

the_module.py

from some_api_module import some_api_call, another_api_call 

def method_one(a, b): 
    return some_api_call(a + b) 

def method_two(c, d, e): 
    return another_api_call(c * d * e) 

我現在需要建立許多類似模塊,針對不同的API模塊,但我希望他們都具有相同的基本設置方法,使我可以導入這些模塊中的任何一個,並調用一個函數,知道這個函數在我構建的所有模塊中表現相同。爲了確保它們都一樣,我想使用某種抽象基本模塊來構建。我通常會抓住Abstract Base Classes module,但由於我根本不使用類,所以這不起作用。

有沒有人知道我如何實現一個抽象基本模塊,我可以在其中構建幾個其他模塊而不使用類?歡迎所有提示!

+0

您要做什麼與'from the_module import *'不同? – roippi

+0

@roippi - 好吧,我總是儘量避免使用通配符導入。我想用這個模塊和它的未來兄弟作爲'import the_module,the_module2,the_module3等',這樣我就可以使用我選擇的模塊來達到我選擇的api,但仍然能夠在每個模塊中使用相同的函數the_module。我只是想抽象出'some_api_module's之間的差異。 – kramer65

+0

我想我還是不明白。你想避免通配符導入(這是合理的),但你想實現的東西基本上就像做一個通配符導入。現在,如果您只想執行'import my_api'並在該命名空間下使用所有可用的命令,無論您的各種api模塊/軟件包是如何佈置的 - 這似乎更合理。 – roippi

回答

0

您不使用類,但可以輕鬆地重寫您的代碼。 一個類基本上是一個包含函數和變量的命名空間,就像一個模塊一樣。 不管你打電話mymodule.method_one()還是mymodule.myclass.method_one(),都不應該產生巨大的影響。

在python中沒有你可能從java中知道的接口。 Python中的範例是Duck typing,這意味着或多或少對於給定的模塊,您可以判斷它是否實現您的API,如果它提供了正確的方法。 Python會這樣做,即確定如果您對類myclass的實例調用myobject[i]該怎麼做。它看起來類是否具有方法__getitem__,如果它這樣做,它會替換myobject[i]myobject.__getitem__(i)。 Yout不必告訴python你的類支持這種訪問,python只是從你定義類的方式中得出結論。 你應該確定你的模塊是否實現你的API。

也許你想看看import mymodule之後隱藏的字典mymodule.__dict__裏面,它包含你模塊的所有函數名和指針。然後,您可以檢查是否存在正確的功能並提出錯誤,否則

import my_module_4 
#check if my_module_4 implements api 
if all(func in my_module_4.__dict__ for func in ("method_one","method_two"): 
    print "API implemented" 
else: 
    print "Warning: Not all API functions found in my_module_4"