В чем разница между конструктором и методом в Python, могу ли я смешать их вместе? - PullRequest
1 голос
/ 10 ноября 2011

Я реализовал подключаемый фреймворк, как показано ниже.

Это работает, но я запутался в реализации 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()

Ответы [ 2 ]

4 голосов
/ 10 ноября 2011

Это часто используемый шаблон, называемый фабричной функцией . Это хорошая идея, чтобы ваш интерфейс был открыт для любого вызываемого объекта, который возвращает объект, независимо от того, является ли вызываемый объект функцией или классом. Это делает вас гибкими для всего, что вы хотите сделать в будущем.

0 голосов
/ 10 ноября 2011

Plugin2 - это функция модуля, которая возвращает объект, в то время как Plugin1 является самим классом и возвращает экземпляр самого себя.

Это хорошо, хотя рекомендованный Python стандарт кодирования будет содержать имена функций в нижнем регистре (http://www.python.org/dev/peps/pep-0008/),так что это было бы plugin2

Для согласованности я бы также использовал функцию модуля для plugin1, чтобы сохранить сходство в случае развития вашей реализации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...