Введение
В этом руководстве мы рассмотрим магические методы последовательностей в 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.



