Сообщить об ошибке.

Отличие enum от классов Python

В разделе перечислены главные отличия перечисления модуля 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 охватывают большинство вариантов использования, они не могут охватывать их все. Смотрите рецепты некоторых различных типов перечислений, которые можно использовать напрямую или в качестве примеров для создания собственных.