Rozumiem, że ponieważ Python ma funkcje pierwszej klasy, używanie wzorca strategii jest zwykle kwestią przekazania funkcji jako argumentu, a nie wymagać od zajęć. Ale co, jeśli "strategie" nie są pojedynczymi funkcjami, ale raczej grupy powiązanych funkcji, które logicznie należy wybrać jako zestaw?Wzór strategii w Pythonie, gdy "strategia" składa się z więcej niż jednej funkcji
jak tutaj jest trywialne i wymyślony przykład:
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
Pomysł jest wybrać strategię i masz funkcję bajtów formatowania i funkcji do formatowania słów jako zestaw, a nie konieczności określenia indywidualnie. Ten przykład jest podobny do tego, jak zrobiłbyś to w języku takim jak C++ (z wyjątkiem tego, że metody nie byłyby statyczne, ponieważ nie możesz mieć wirtualnych metod statycznych w C++) i to nie jest tak, że nie działa w Pythonie. Ale wiąże się to z definicją grupy "klas", które mają tylko statyczne metody i nie mają być tworzone, co wydaje się nie-Pythoniczne.
Czy jest to bardziej idiomatyczny sposób na to w Pythonie?
Czy strategią musi być pojedynczy obiekt? Jeśli nie, możesz przekazać wiele funkcji, np. za pomocą argumentów słów kluczowych, lub może przekazać krotkę lub nazwaną krotką funkcji. –