Шаг 158.
Основы языка Python.
Итераторы, контейнеры и перечисления. Перечисления (окончание)

    На этом шаге мы рассмотрим операции над перечислениями.

    Над элементами перечислений можно производить следующие операции:

    Помимо элементов, классы перечислений могут включать атрибуты экземпляра класса и методы - как экземпляров, так и объектов класса. При этом методы экземпляра класса всегда вызываются у элемента перечисления (и, соответственно, первым параметром ему передается ссылка на экземпляр класса, представляющий элемент перечисления, у которого был вызван метод), а методы объекта класса - у самого класса перечисления. Для примера давайте рассмотрим код класса перечисления VersionExtended:

# Перечисление, включающее атрибуты и методы
from enum import Enum
class VersionExtended(Enum):
    V2_7 = "2.7"
    V3_4 = "3.4"
    # Методы экземпляра класса.
    # Вызываются у элемента перечисления
    def describe(self):
        return self.name, self.value
    def __str__(self):
        return str(__class__.__name__) + "." + self.name + ": " + \
               self.value

    # Метод объекта класса.
    # Вызывается у самого класса перечисления
    @classmethod
    def getmostfresh(els):
        return cls.V3_4     
Архив с файлом можно взять здесь.

    В методе __str__ () мы использовали встроенную переменную __class__, хранящую ссылку на объект текущего класса. Атрибут __name__ этого объекта содержит имя класса в виде строки.

    Осталось лишь проверить готовый класс в действии, для чего введем следующий код:

>>> d = VersionExtended.V2_7.describe()
>>> print (d[0] + ", " + d[1])
V2_7, 2.7
>>> print (VersionExtended.V2_7)
VersionExtended.V2_7: 2.7
>>> print (VersionExtended.getmostfresh())
VersionExtended.V3_4: 3.4

    Осталось отметить одну важную деталь. На основе класса перечисления можно создавать подклассы только в том случае, если этот класс не содержит атрибутов объекта класса, т. е. собственно элементов перечисления. Если же класс перечисления содержит элементы, попытка определения его подкласса приведет к ошибке. Пример:

>>> class ExtendedColors(Colors): pass

Traceback (most recent call last):
  File "<pyshell#68>", line 1, in 
    class ExtendedColors(Colors): pass
  File "C:\Python34\lib\enum.py", line 93, in __new__
    member_type, first_enum = metacls._get_mixins_(bases)
  File "C:\Python34\lib\enum.py", line 361, in _get_mixins_
    raise TypeError("Cannot extend enumerations")
TypeError: Cannot extend enumerations


   Примечание. В составе стандартной библиотеки Python уже давно присутствует модуль struct, позволяющий создавать нечто похожее на перечисления. Однако он не столь удобен в работе, как инструменты, предлагаемые модулем enum.

    Со следующего шага мы начнем рассматривать работу с файлами и каталогами.




Предыдущий шаг Содержание Следующий шаг