На этом шаге мы рассмотрим операции над перечислениями.
Над элементами перечислений можно производить следующие операции:
>>> Versions.V3_4 <Versions.V3_4: '3.4'> >>> e = Versions.V3_4 >>> e <Versions.V3_4: '3.4'>
>>> Versions ["V3_4"] <Versions.V3_4: '3.4'>
>>> Versions ("3.4") <Versions.V3_4: '3.4'>
>>> Versions.V2_7.name, Versions.V2_7.value
('V2_7', '2.7')
>>> list (Colors) [<Colors.Red: 1>, <Colors.Green: 2>, <Colors.Blue: 3>] >>> for c in Colors: print(c.value, end = " ") 1 2 3
>>> e = Versions.V3_4 >>> e == Versions.V3_4 True >>> e != Versions.V2_7 True >>> e in Versions True >>> e in Colors False
Отметим, что элементы разных перечислений всегда не равны друг другу, даже если они и хранят одинаковые значения;
>>> Colors.Red + 1 2 >>> Colors.Green != 3 True >>> ["a", "b", "c"][Colors.Red] 'b'
Помимо элементов, классы перечислений могут включать атрибуты экземпляра класса и методы - как экземпляров, так и объектов класса. При этом методы экземпляра класса всегда вызываются у элемента перечисления (и, соответственно, первым параметром ему передается ссылка на экземпляр класса, представляющий элемент перечисления, у которого был вызван метод), а методы объекта класса - у самого класса перечисления. Для примера давайте рассмотрим код класса перечисления 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, inclass 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
Со следующего шага мы начнем рассматривать работу с файлами и каталогами.