我有一個項目,我們正試圖爲幾個python GIS庫創建一個更簡單的接口。基於我們期望的設計模式,我們希望用戶只使用/引用超類方法而不知道子類的內部運作。通過調用超級類創建子類python
基於傳遞給超類構造函數的文件路徑擴展,是否可以創建子類,然後讓用戶對超類方法的調用通過子類進行處理?換句話說,如果用戶想要與汽車互動,他們可以給汽車級一輛法拉利藍圖,並讓汽車「超級」引用Ferarri「子類」方法嗎?
這在設計原則上似乎有些倒退。
我有一個項目,我們正試圖爲幾個python GIS庫創建一個更簡單的接口。基於我們期望的設計模式,我們希望用戶只使用/引用超類方法而不知道子類的內部運作。通過調用超級類創建子類python
基於傳遞給超類構造函數的文件路徑擴展,是否可以創建子類,然後讓用戶對超類方法的調用通過子類進行處理?換句話說,如果用戶想要與汽車互動,他們可以給汽車級一輛法拉利藍圖,並讓汽車「超級」引用Ferarri「子類」方法嗎?
這在設計原則上似乎有些倒退。
像你想的工廠模式聽起來很多:
在面向對象編程(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)
我認爲我的計劃會比這更復雜一點,但是這個答案我最初的問題。謝謝您的幫助! – tomtom92
的可能的複製[有沒有在動態語言接口的任何一點?( http://stackoverflow.com/questions/91618/is-there-any-point-for-interfaces-in-dynamic-languages) –