Магические методы последовательностей

PythonBeginner
Практиковаться сейчас

Введение

В этом руководстве мы рассмотрим магические методы последовательностей в Python. Эти методы позволяют вам настраивать поведение собственных классов при использовании в различных операциях, таких как получение длины объекта, доступ к элементам, срезы и итерация.

Длина и включение

Методы длины и включения - это специальные методы в Python, которые позволяют объектам определить свое поведение при использовании с встроенными функциями или операторами, такими как len(), in и not in.

Пустим начать с простого объекта. В sequence.py создайте класс под названием MySequence, который имеет атрибут data.

class MySequence:
    def __init__(self, data: list):
        """Initialize a new MySequence object with the given data."""
        self.data = data

__len__

Магический метод __len__ используется для определения поведения функции len() при применении к экземплярам вашего класса.

    #... (предыдущий код в sequence.py)

    def __len__(self) -> int:
        """Return the length of the sequence."""
        return len(self.data)

__contains__

Магический метод __contains__ используется для определения поведения операторов in и not in при применении к экземплярам вашего класса.

    #... (предыдущий код в sequence.py)

    def __contains__(self, item: object) -> bool:
        """Check if the sequence contains the given item."""
        return item in self.data

Пример: Использование методов длины и включения

Теперь, когда мы определили методы длины и включения для нашего класса MySequence, давайте посмотрим, как они работают в length_containment_example.py:

from sequence import MySequence

## Create a MySequence object
my_seq = MySequence([1, 2, 3, 4, 5])

## Test the __len__ magic method
print(len(my_seq))  ## Output: 5

## Test the __contains__ magic method
print(3 in my_seq)  ## Output: True
print(3 not in my_seq)  ## Output: False
print(10 in my_seq)  ## Output: False

Затем введите следующую команду в терминале, чтобы выполнить скрипт.

python length_containment_example.py

Доступ к элементам

Методы доступа к элементам - это специальные методы в Python, которые позволяют объектам определить свое поведение при доступе с использованием квадратных скобок [].

__getitem__

Магический метод __getitem__ используется для определения поведения квадратных скобок при доступе к элементам в экземплярах вашего класса.

    #... (предыдущий код в sequence.py)

    def __getitem__(self, index: int) -> object:
        """Return the item at the given index."""
        return self.data[index]

__setitem__

Магический метод __setitem__ используется для определения поведения квадратных скобок при установке элементов в экземплярах вашего класса.

    #... (предыдущий код в sequence.py)

    def __setitem__(self, index: int, value: object) -> None:
        """Set the item at the given index to the given value."""
        self.data[index] = value

__delitem__

Магический метод __delitem__ используется для определения поведения ключевого слова del при применении к экземплярам вашего класса.

    #... (предыдущий код в sequence.py)

    def __delitem__(self, index: int) -> None:
        """Remove the item at the given index."""
        del self.data[index]

Пример: Использование методов доступа к элементам

Теперь, когда мы определили методы доступа к элементам для нашего класса MySequence, давайте посмотрим, как они работают в item_access_example.py:

from sequence import MySequence

## Create a MySequence object
my_seq = MySequence([1, 2, 3, 4, 5])

## Test the __getitem__ magic method
print(my_seq[2])  ## Output: 3

## Test the __setitem__ magic method
my_seq[2] = 9
print(my_seq[2])  ## Output: 9

## Test the __delitem__ magic method
del my_seq[2]
print(len(my_seq))  ## Output: 4
print(my_seq.data)  ## Output: [1, 2, 4, 5]

Затем введите следующую команду в терминале, чтобы выполнить скрипт.

python item_access_example.py

Итерация

Методы итерации - это специальные методы в Python, которые позволяют объектам определить свое поведение при использовании с протоколами итерации.

__iter__

Магический метод __iter__ используется для определения поведения функции iter() и цикла for... in... при применении к экземплярам вашего класса.

    #... (предыдущий код в sequence.py)

    def __iter__(self):
        """Return an iterator for the sequence."""
        for item in self.data:
            yield item

__reversed__

Магический метод __reversed__ используется для определения поведения функции reversed() при применении к экземплярам вашего класса.

    #... (предыдущий код в sequence.py)

    def __reversed__(self):
        """Return a reversed iterator for the sequence."""
        return reversed(self.data)

Пример: Использование методов итерации

Теперь, когда мы определили методы итерации для нашего класса MySequence, давайте посмотрим, как они работают в iteration_example.py:

from sequence import MySequence

## Create a MySequence object
my_seq = MySequence([1, 2, 3, 4, 5])

## Test the __iter__ magic method
for item in my_seq:
    print(item, end=" ")  ## Output: 1 2 4 5

## Test the __reversed__ magic method
for item in reversed(my_seq):
    print(item, end=" ")  ## Output: 5 4 2 1

Затем введите следующую команду в терминале, чтобы выполнить скрипт.

python iteration_example.py

Резюме

С помощью реализованных магических методов наш пользовательский класс MySequence теперь ведет себя подобно встроенным типам последовательностей, таким как списки и кортежи. Теперь вы можете использовать его так, будто это натуральная последовательность на Python.