2016-01-29 39 views
0

我有一個項目,我們正試圖爲幾個python GIS庫創建一個更簡單的接口。基於我們期望的設計模式,我們希望用戶只使用/引用超類方法而不知道子類的內部運作。通過調用超級類創建子類python

基於傳遞給超類構造函數的文件路徑擴展,是否可以創建子類,然後讓用戶對超類方法的調用通過子類進行處理?換句話說,如果用戶想要與汽車互動,他們可以給汽車級一輛法拉利藍圖,並讓汽車「超級」引用Ferarri「子類」方法嗎?

這在設計原則上似乎有些倒退。

+0

的可能的複製[有沒有在動態語言接口的任何一點?( http://stackoverflow.com/questions/91618/is-there-any-point-for-interfaces-in-dynamic-languages) –

回答

1

像你想的工廠模式聽起來很多:

在面向對象編程(OOP),工廠是 創建其他對象的對象 - 一個正式的工廠是一個函數或方法 它返回不同原型或類的對象。

但是,你不應該把功能放在Car的構造函數中。在你的情況下,Car只是很多種不同汽車的通用接口。因此,接口不需要知道任何關於實現的內容,並且包括您的子類的名稱。

你會用一個簡單的函數,實例化你的對象要好得多:

class Car(object): 
    pass 
class Ferrari(Car): 
    pass 
class Volkswagen(Car): 
    pass 
def car_factory(blueprint, *args, **kwargs): 
    if blueprint == "Ferrari": 
     return Ferrari(*args, **kwargs) 
    if blueprint == "Volkswagen": 
     return Volkswagen(*args, **kwargs) 

或者乾脆

def car_factory(blueprint, *args, **kwargs): 
    cars = {"Ferrari":Ferrari, 
      "Volkswagen":Volkswagen} 
    return cars[blueprint](*args, **kwargs) 
+0

我認爲我的計劃會比這更復雜一點,但是這個答案我最初的問題。謝謝您的幫助! – tomtom92