Aufzählungstypen in Python

高洛峰
Freigeben: 2016-11-22 17:13:54
Original
1463 Leute haben es durchsucht

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
Nach dem Login kopieren

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':
Nach dem Login kopieren
{'FRI': 5, 'TUS': 2, 'MON': 5, 'WEN': 3, 'THU': 4}
Nach dem Login kopieren

Eine durch eine Klasse definierte Aufzählung kann sogar instanziiert und unscheinbar werden:

c = Color()
print(c.RED)
Color.RED = 2
print(c.RED)
Nach dem Login kopieren
0
2
Nach dem Login kopieren

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])
Nach dem Login kopieren
R G B
Nach dem Login kopieren

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)
Nach dem Login kopieren
duplicate values found in <enum &#39;WEEKDAY&#39;>: FRI -> MON
Nach dem Login kopieren
try:    class Color(IntEnum):
        RED   = 0
        GREEN = 1
        BLUE  = &#39;b&#39;except ValueError as e:
    print(e)
Nach dem Login kopieren
invalid literal for int() with base 10: &#39;b&#39;
Nach dem Login kopieren

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
Nach dem Login kopieren
try:
    Color.R = 2except AttributeError as e:
    print(e)
Nach dem Login kopieren
Cannot reassign members.
Nach dem Login kopieren

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)
Nach dem Login kopieren
Color.R Color.G Color.B
Nach dem Login kopieren

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) # 不等于任何非本枚举类的值
Nach dem Login kopieren
True
True
False
True
False
Nach dem Login kopieren

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)
Nach dem Login kopieren
Color.B
Color.R
Nach dem Login kopieren

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, &#39;:&#39;, red.value)

class Attr(Enum):
    name  = &#39;NAME&#39;
    value = &#39;VALUE&#39;
print(Attr.name.value, Attr.value.name)
Nach dem Login kopieren
R : 0
NAME value
Nach dem Login kopieren

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 !


Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage