2011-11-10 31 views
1

我實現了像下面這樣的可插入框架。Python中的構造函數和方法有什麼不同,我可以將它們混合在一起嗎?

它的工作原理,但我對Plugin2的實現感到困惑。似乎它使用一個普通的方法,而不是一個類的構造函數。

我可以這樣做嗎?有什麼缺點嗎?

這是一個常用的「模式」?如果是,模式名稱是什麼? '鴨子打字'?我應該避免這樣的用法嗎?

UPDATE:我關心的是下面的方法:

def addPlugin(name, plugin) 

現在參數插件可以是一個類或方法。然後這對插件開發者來說有點模糊。這是動態編程語言世界中的常見情況嗎?

class MyFramework(object): 
    _plugins = {} 
    _osType = None 
    @staticmethod 
    def addPlugin(name, plugin): 
     MyFramework._plugins[name]= plugin 

    def __init__(self, osType): 
     self._osType = osType 
     for name, plugin in MyFramework._plugins.items(): 
     setattr(self, name, plugin(self, self._osType)) 

class Plugin1(object): 
    def __init__(self, owner, osType): 
     self.owner= owner 
     self.osType = osType 
    def hello(self): 
     print 'this is plugin1' 

def Plugin2(owner, osType): 
    if (osType == "Linux"): 
     return Plugin2Linux(owner) 
    else: 
     return Plugin2Common(owner) 

class Plugin2Linux(object): 
    def __init__(self, owner): 
     self.owner= owner 
    def hello(self): 
     print 'this is plugin2 Linux version' 

class Plugin2Common(object): 
    def __init__(self, owner): 
     self.owner= owner 
    def hello(self): 
     print 'this is plugin2 common version' 

MyFramework.addPlugin("plugin1", Plugin1) 
MyFramework.addPlugin("plugin2", Plugin2) 

framework = MyFramework("Linux") 

plugin1 = getattr(framework, "plugin1") 
plugin2 = getattr(framework, "plugin2") 

plugin1.hello() 
plugin2.hello() 

回答

4

這是一個經常使用的模式,稱爲factory function。無論可調用函數是一個函數還是一個類,將接口打開爲返回對象的任何可調用對象都是一個好主意。它讓你靈活適應未來你想做的任何事情。

+0

是的,它確實是一個工廠功能。但考慮以下方法: def addPlugin(名稱,插件): 現在,插件可以是Class或Method。然後這對插件開發者來說有點模糊。他們可能會問,我是否應該通過一個類或方法? 我相信一個框架應該是清晰和精確的。以上情況顯然不是一個好的樣本。 –

+0

這不是一種方法 - 它是一種功能。 (一個方法是一個函數,它是一個類屬性,比如'Plugin1.hello'。)一個可以被調用的對象的正確名詞是一個「可調用的」,它將包括函數,類和任何帶有' __call __()'方法。我可能會在文檔中指定一個可調用對象。如果您不想在文檔中進入這種複雜程度,則很容易指定它是一個類,並且傳遞其他可調用對象的能力可能是未公開的獎勵。 –

0

Plugin2是一個模塊函數,它返回一個對象,而Plugin1是一個類本身並返回一個自身的實例。

這是正常,雖然Python的推薦編碼標準會讓你小寫的函數名(http://www.python.org/dev/peps/pep-0008/),所以這將是plugin2

對於一致性,我還會使用plugin1的模塊函數來保持相似性,以防您的實現發展。

+0

對不起,對'模塊功能'有什麼意義?爲每個插件創建一個模塊?或者是其他東西? –

+0

我只是指一個函數不是你的類定義的文件中類的一部分。我將該文件稱爲模塊,但也許這是不對的。 – bigendian

相關問題