В разделе перечислены главные отличия перечисления модуля enum
У перечислений модуля enum
есть собственный метакласс, который влияет на многие аспекты как производных классов Enum
, так и их экземпляров (членов).
enum.Enum
.Метакласс EnumMeta
отвечает за предоставление __contains__()
, __dir__()
, __iter__()
и других магических методов, которые позволяют делать с классом enum.Enum
вещи, которые не работают в типичном классе, например list(Color)
:
>>> from enum import Enum >>> class ColorEnum(Enum): ... RED = 1 ... GREEN = 2 ... BLUE = 3 ... # простой класс >>> class Color(): ... RED = 1 ... GREEN = 2 ... BLUE = 3 ... >>> list(ColorEnum) # [<ColorEnum.RED: 1>, <ColorEnum.GREEN: 2>, <ColorEnum.BLUE: 3>] >>> list(Color) # Traceback (most recent call last): # File "<stdin>", line 1, in <module> # TypeError: 'type' object is not iterable
Метакласс EnumMeta
отвечает за обеспечение правильности различных других методов в классе Enum
. Например, __new__()
, __getnewargs__()
, __str__()
и __repr__()
.
Самое интересное в членах перечисления - это то, что они синглтоны. EnumType
создает их все во время создания самого класса enum
, а затем помещает пользовательский __new__()
на место. Это гарантирует, что никакие новые никогда не будут созданы, возвращая только существующие экземпляры членов.
Хотя предполагается, что Enum
, IntEnum
, StrEnum
, Flag
и IntFlag
охватывают большинство вариантов использования, они не могут охватывать их все. Смотрите рецепты некоторых различных типов перечислений, которые можно использовать напрямую или в качестве примеров для создания собственных.