Wenn Sie einen Algorithmus aus mehreren Optionen auswählen möchten, möchten Sie möglicherweise jedem Wert des Aufzählungstyps eine Funktion zuordnen.
In Java können Sie für jeden Wert eines Aufzählungstyps eine Methode festlegen, in Python jedoch nicht. Lassen Sie uns darüber nachdenken, wie man es ordentlich schreibt, um Enum selbst Callable zu machen.
Der Wert von Enum in Python kann frei festgelegt werden. Daher sollte der Wert selbst zu einer Funktion gemacht werden.
Die in der Klasse, die Enum erbt, definierte Funktion wird jedoch als Methode beurteilt und ist in den aufgelisteten Werten nicht enthalten.
class Dame(Enum):
#Sie haben den Wert nicht definiert, Sie haben die Methode definiert
A = lambda: print("A")
list(Dame)
#Leere Liste
Also habe ich mir diese Stackoverflow-Idee ausgeliehen und mich entschieden, den Taple mit der Funktion als Wert zu verwenden.
from enum import Enum
class CallableEnum(Enum):
"""
Erben Sie diese Klasse, um eine aufrufbare Aufzählung zu erstellen
"""
def __call__(self, *args,**kwargs):
return self.value[0](*args,**kwargs)
def register(func):
"""
Decorator zum einfachen Definieren des Tupels, das die Funktion enthält
"""
return func,
Hier erfahren Sie, wie Sie es verwenden.
class Test(CallableEnum):
@register
def A():
print("A")
@register
def B():
print("B")
Test.A()
# A
Geben Sie der Klasse "T", die Enum erbt, ein Wörterbuch von "T" für die Funktion und verweisen Sie in "call" darauf.
Wenn jedoch " T
to function dictionary "als Attribut von T
in der Klassendefinition enthalten ist, ist dies auch einer der aufgezählten Werte. Sie müssen es hinzufügen, nachdem T
als Klasse abgeschlossen ist.
Daher können Sie nach Abschluss der Klassendefinition eine Funktion hinzufügen.
from enum import Enum
class Dnum(Enum):
"""
Enum versenden. Erben Sie diesen Kerl
"""
@classmethod
def register(cls, key):
if not hasattr(cls, "table"):
cls.table = {}
def registration(func):
cls.table[key] = func
return registration
def __call__(self, *args,**kwargs):
return self.__class__.table[self](*args,**kwargs)
def register(enum):
def ret(func):
enum.__class__.register(enum)(func)
return ret
Verwenden Sie es so.
from enum import auto
class Test(Dnum):
A = "A"
B = "B"
@register(Test.A)
def _A():
print("A")
@register(Test.B)
def _B():
print("B")
Test.A()
# A
Gibt es einen Trick, um eine Funktion in die Klassendefinition zu schreiben, während der Wert frei eingestellt wird?