На этом шаге мы рассмотрим указанный тип контейнеров.
Класс, реализующий функциональность перечисления, должен переопределять уже знакомые нам методы: __getitem__(), __setitem__(), __delitem__() и __contains__(). Разумеется, при этом следует сделать поправку на то, что вместо индексов здесь будут использоваться ключи произвольного типа (как правило, строкового).
Давайте напишем класс Version, который будет хранить номер версии интерпретатора Python, разбитый на части: старшая цифра, младшая цифра и подрелиз. Причем доступ к частям номера версии мы будем получать по строковым ключам, как в обычном словаре Python. Ради простоты чтения кода функциональность итератора реализовывать не станем, а также заблокируем операцию удаления элемента словаря, возбудив в методе __delitem__() исключение TypeError.
Приведем текст класса:
class Version: def __init__(self, major, minor, sub): self.__major = major # Старшая цифра self.__minor = minor # Младшая цифра self.__sub = sub # Подверсия def __str__(self): return str(self.__major) + "." + str(self.__minor) + "." + \ str(self.__sub) # Реализуем функциональность словаря def __getitem__(self, k): if k == "major": return self.__major elif k == "minor": return self.__minor elif k == "sub": return self.__sub else: raise IndexError def __setitem__(self, k, v): if k == "major": self.__major = v elif k == "minor": self.__minor = v elif k == "sub": self.__sub = v else: raise IndexError def __delitem__(self, k): raise TypeError def __contains__(self, v): return v == "major" or v == "minor" or v == "sub"
Проверим работу созданного класса:
>>> v = Version (3, 4, 3) >>> print (v["major"]) 3 >>> v["sub"] = 4 >>> print (str(v)) 3.4.4
Получили результаты, которые ожидались.
На следующем шаге мы рассмотрим перечисления.