我實現了像下面這樣的可插入框架。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()
是的,它確實是一個工廠功能。但考慮以下方法: def addPlugin(名稱,插件): 現在,插件可以是Class或Method。然後這對插件開發者來說有點模糊。他們可能會問,我是否應該通過一個類或方法? 我相信一個框架應該是清晰和精確的。以上情況顯然不是一個好的樣本。 –
這不是一種方法 - 它是一種功能。 (一個方法是一個函數,它是一個類屬性,比如'Plugin1.hello'。)一個可以被調用的對象的正確名詞是一個「可調用的」,它將包括函數,類和任何帶有' __call __()'方法。我可能會在文檔中指定一個可調用對象。如果您不想在文檔中進入這種複雜程度,則很容易指定它是一個類,並且傳遞其他可調用對象的能力可能是未公開的獎勵。 –