Я хочу сделать класс, который использует шаблон проектирования стратегии, подобную этой:Как использовать статический метод в качестве параметра по умолчанию для шаблона проектирования стратегии?
class C:
@staticmethod
def default_concrete_strategy():
print("default")
@staticmethod
def other_concrete_strategy():
print("other")
def __init__(self, strategy=C.default_concrete_strategy):
self.strategy = strategy
def execute(self):
self.strategy()
Это дает ошибку:
NameError: name 'C' is not defined
Замена strategy=C.default_concrete_strategy
с strategy=default_concrete_strategy
будет работать, но, слева по умолчанию, то переменная экземпляра стратегии будет объектом статического метода, а не вызываемым методом.
TypeError: 'staticmethod' object is not callable
Это будет работать, если я удалить @staticmethod
декоратор, но есть какой-то другой способ? Я хочу, чтобы параметр по умолчанию был сам документирован, чтобы другие сразу увидели пример того, как включить стратегию.
Также есть лучший способ разоблачить стратегии, а не статические методы? Я не думаю, что реализация полноценных классов имеет смысл здесь.
Шаблон стратегии в основном бесполезен в python. Поскольку у вас есть функции как объекты первого класса, вы можете просто передавать функции. – Bakuriu
@Bakuriu Ну, как вы можете видеть, стратегия - это функция объекта первого класса. Я думаю, что это все еще называется стратегическим шаблоном? – mtanti
Да, но схема стратегии была в основном изобретена на языках, которые не позволяют передавать функции. Я имею в виду, что в 99% случаев использования вашего класса вы можете просто передать функцию напрямую и получить те же результаты с меньшей сложностью. – Bakuriu