Я понимаю, что поскольку Python имеет первоклассные функции, использование шаблона Strategy обычно является вопросом передачи функции в качестве аргумента и не требуют использования с классами. Но что, если «стратегии» - это не отдельные функции, а скорее группы связанных функций, которые логически должны быть выбраны в качестве набора?Стратегия в Python, когда «стратегия» состоит из более чем одной функции
Мол, вот тривиальный и надуманный пример:
class HexFormatter(object):
"""Base class for strategies to format hexadecimal numbers."""
pass
class Motorola(HexFormatter):
"""Format Motorola style (e.g. $1234)"""
@staticmethod
def formatbyte(n):
return "$%02X" % n
@staticmethod
def formatword(n):
return "$%04X" % n
class Intel(HexFormatter):
"""Format Intel-style (e.g. 1234h)"""
@staticmethod
def formatbyte(n):
return "%02Xh" % n
@staticmethod
def formatword(n):
return "%04Xh" % n
Идея заключается в том вы выбираете стратегию, и вы получите функции для форматирования байтов и функции для форматирования слов в виде набора, а не необходимости указывать их индивидуально. Этот пример сродни тому, как вы это сделаете на языке, таком как C++ (за исключением того, что методы не были бы статичными, потому что вы не можете иметь виртуальные статические методы на C++), и это не так, как если бы он не работал на Python. Но это связано с определением группы «классов», которые имеют только статические методы и не предназначены для инстанцирования, что почему-то кажется не-Pythonic.
Есть ли более идиоматический способ сделать это в Python?
Это необходимость для стратегии быть единым объектом? Если нет, вы можете передавать несколько функций, например. через аргументы ключевого слова или, возможно, передать кортеж или названный набор функций. –