fork(1) download
  1. from abc import ABCMeta, abstractmethod
  2.  
  3.  
  4. class IStrategy:
  5. """ Класс реализующий конкретную стратегию, должен наследовать этот абстрактный класс
  6. Класс контекста использует этот абстрактный класс для вызова конкретной стратегии """
  7. __metaclass__ = ABCMeta
  8.  
  9. @abstractmethod
  10. def algorithm(self):
  11. pass
  12.  
  13.  
  14. class ConcreteStrategy1(IStrategy):
  15. """ Первая конкретная реализация-стратегия. """
  16.  
  17. def algorithm(self):
  18. print("Выполняется алгоритм стратегии 1")
  19.  
  20.  
  21. class ConcreteStrategy2(IStrategy):
  22. """ Вторая конкретная реализация-стратегия.
  23. (P.S. Реализаций может быть сколько угодно много.) """
  24.  
  25. def algorithm(self):
  26. print("Выполняется алгоритм стратегии 2")
  27.  
  28.  
  29. class Context:
  30. """ Контекст, использующий стратегию для решения своей задачи.
  31.  
  32. Конструктор контекста.
  33. Инициализирует объект стратегией."""
  34. def __init__(self, strategy):
  35. self.strategy = strategy
  36.  
  37. """ Метод для установки стратегии.
  38. Служит для смены стратегии во время выполнения. """
  39.  
  40. def set_strategy(self, strategy):
  41. self.strategy = strategy
  42.  
  43. """ Некоторая функциональность контекста, которая выбирает
  44. стратегию и использует её для решения своей задачи. """
  45.  
  46. def execute_operation(self):
  47. self.strategy.algorithm(self)
  48.  
  49.  
  50. if __name__ == '__main__':
  51. context = Context(ConcreteStrategy1)
  52. context.execute_operation()
  53.  
  54. context = Context(ConcreteStrategy2)
  55. context.execute_operation()
Runtime error #stdin #stdout #stderr 0.02s 6816KB
stdin
Standard input is empty
stdout
Standard output is empty
stderr
Traceback (most recent call last):
  File "prog.py", line 52, in <module>
  File "prog.py", line 47, in execute_operation
TypeError: unbound method algorithm() must be called with ConcreteStrategy1 instance as first argument (got Context instance instead)