Der Aufzählungstyp kann als Beschriftung oder Sammlung von Konstanten betrachtet werden, die normalerweise zur Darstellung bestimmter begrenzter Sammlungen wie Wochentage, Monate, Status usw. verwendet werden. Es gibt keinen speziellen Aufzählungstyp in den nativen Typen von Python (integrierte Typen), aber wir können ihn über viele Methoden wie Wörterbücher, Klassen usw. implementieren:
WEEKDAY = { 'MON': 1, 'TUS': 2, 'WEN': 3, 'THU': 4, 'FRI': 5 } class Color: RED = 0 GREEN = 1 BLUE = 2
Sie können die beiden oben genannten sehen Methoden Es handelt sich um eine einfache Implementierung eines Aufzählungstyps. Wenn solche Aufzählungsvariablen nur im lokalen Bereich verwendet werden, besteht das Problem darin, dass sie alle veränderbar sind, was bedeutet, dass sie an anderer Stelle geändert werden können Verwendung:
WEEKDAY['MON'] = WEEKDAY['FRI']print(WEEKDAY) {'FRI': 5, 'TUS':
{'FRI': 5, 'TUS': 2, 'MON': 5, 'WEN': 3, 'THU': 4}
Eine durch eine Klasse definierte Aufzählung kann sogar instanziiert und unscheinbar werden:
c = Color() print(c.RED) Color.RED = 2 print(c.RED)
0 2
Natürlich können auch Variablentypen verwendet werden (unveränderlich), wie z. B. Tupel, aber dadurch geht die ursprüngliche Bedeutung von Aufzählungstypen verloren und Labels werden zu bedeutungslosen Variablen degradiert:
COLOR = ('R', 'G', 'B') print(COLOR[0], COLOR[1], COLOR[2])
R G B
Um eine bessere Lösung bereitzustellen, hat Python die Enum-Standardbibliothek hinzugefügt in Version 3.4 bis PEP 435. Versionen vor 3.4 können auch kompatible und unterstützte Bibliotheken über pip install enum herunterladen. enum bietet drei Tools: Enum/IntEnum/unique, und die Verwendung ist sehr einfach. Sie können den Aufzählungstyp durch Erben von Enum/IntEnum definieren, wobei IntEnum die Aufzählungsmitglieder auf ganzzahlige Typen beschränkt (oder in diese konvertiert werden kann) und die eindeutige Die Methode kann verwendet werden als: Der Dekorator schränkt die Werte von Aufzählungsmitgliedern so ein, dass sie nicht wiederholbar sind:
from enum import Enum, IntEnum, uniquetry: @unique class WEEKDAY(Enum): MON = 1 TUS = 2 WEN = 3 THU = 4 FRI = 1except ValueError as e: print(e)
duplicate values found in <enum 'WEEKDAY'>: FRI -> MON
try: class Color(IntEnum): RED = 0 GREEN = 1 BLUE = 'b'except ValueError as e: print(e)
invalid literal for int() with base 10: 'b'
Was noch interessanter ist, ist, dass die Mitglieder von Enum alle sind Singletons (Singleton) und können nicht instanziiert werden:
class Color(Enum): R = 0 G = 1 B = 2
try: Color.R = 2except AttributeError as e: print(e)
Cannot reassign members.
Obwohl es nicht instanziiert werden kann, können Aufzählungsmitglieder Variablen zugewiesen werden:
red = Color(0) green = Color(1) blue = Color(2) print(red, green, blue)
Color.R Color.G Color.B
Sie können auch Vergleichsurteile fällen:
print(red is Color.R) print(red == Color.R) print(red is blue) print(green != Color.B) print(red == 0) # 不等于任何非本枚举类的值
True True False True False
Letzter Punkt: Da die Aufzählungsmitglieder selbst auch Aufzählungstypen sind, können andere Mitglieder auch über die Aufzählungsmitglieder gefunden werden:
print(red.B) print(red.B.G.R)
Color.B Color.R
Aber Sie müssen diese Funktion mit Vorsicht verwenden, da es zu Konflikten mit Namen im ursprünglichen Namespace des Mitglieds kommen kann:
print(red.name, ':', red.value) class Attr(Enum): name = 'NAME' value = 'VALUE' print(Attr.name.value, Attr.value.name)
R : 0 NAME value
Zusammenfassung
Die Verwendung Das Enum-Modul ist sehr einfach und seine Funktionen sind sehr einfach, aber die Art und Weise, wie es implementiert wird, ist es wert, gelernt zu werden. Wenn Sie mehr über die schwarze Magie von Klassen und Metaklassen in Python erfahren möchten, aber nicht wissen, wie Sie anfangen sollen, lesen Sie vielleicht den Quellcode von enum oder achten Sie auf den Inhalt der nächsten Artikel !