Я реализовал подключаемый фреймворк, как показано ниже.
Это работает, но я запутался в реализации Plugin2.Кажется, он использует обычный метод вместо конструктора класса.
Могу ли я сделать это?Есть ли минусы?
Это нормально используемый шаблон?Если это так, как называется шаблон?«Утиная печать»?Должен ли я избегать использования, подобного этому?
ОБНОВЛЕНИЕ: Меня беспокоит метод ниже:
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()