Введение в объект как коллекцию в Python
Список в Python уже ведет себя как коллекция: у него есть длина, доступ по индексу, перебор в цикле. Свой класс можно научить тому же, если данные хранить внутри объекта, а снаружи перехватывать обращения специальными методами.
Пусть класс хранит числа в приватном
списке __data. Снаружи мы хотим
узнавать, сколько элементов лежит
в объекте, через функцию len.
Для этого в классе объявляют метод
__len__.
Метод __len__ не вызывают вручную
с точкой: его вызывает Python, когда
вы пишете len от объекта.
Внутри метода обычно возвращают длину
внутреннего списка.
Давайте сделаем такой класс:
class Numbers:
def __init__(self):
self.__data = [1, 2, 3]
def __len__(self):
return len(self.__data)
Создадим объект и узнаем его длину:
nums = Numbers()
print(len(nums)) # выведет 3
Тот же прием работает для списка объектов. Пусть класс хранит сотрудников:
class Employee:
def __init__(self, name):
self.name = name
class Workers:
def __init__(self):
self.__data = [
Employee('john'),
Employee('smit'),
]
def __len__(self):
return len(self.__data)
Проверим длину коллекции сотрудников:
workers = Workers()
print(len(workers)) # выведет 2
Метод __len__ - первый шаг к объекту-
коллекции. Еще есть __getitem__,
__setitem__, __delitem__,
__iter__ и __contains__.
Они позволяют работать с объектом
почти как со списком.