Шаг 156.
Основы языка Python.
Итераторы, контейнеры и перечисления. Контейнеры. Контейнеры-словари

    На этом шаге мы рассмотрим указанный тип контейнеров.

    Класс, реализующий функциональность перечисления, должен переопределять уже знакомые нам методы: __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

    Получили результаты, которые ожидались.

    На следующем шаге мы рассмотрим перечисления.




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