В Python «dunder» — это разговорный термин, используемый для обозначения методов «двойного подчеркивания», официально известных как магические методы или специальные методы. Эти методы позволяют определить поведение классов и объектов в ответ на определенные операции. В этой статье мы рассмотрим различные методы dunder в Python с примерами кода, чтобы продемонстрировать их использование и возможности.
__init__(self, ...)
:
Метод__init__
вызывается при создании объекта. Он инициализирует атрибуты объекта и выполняет всю необходимую настройку.
class MyClass:
def __init__(self, x):
self.x = x
obj = MyClass(10)
print(obj.x) # Output: 10
__str__(self)
и__repr__(self)
:
Эти методы предоставляют строковое представление объекта.__str__
используется для неформального строкового представления, а__repr__
обеспечивает более формальное представление.
class Point:
def __init__(self, x, y):
self.x = x
self.y = y
def __str__(self):
return f"Point({self.x}, {self.y})"
def __repr__(self):
return f"Point({self.x}, {self.y})"
p = Point(3, 4)
print(str(p)) # Output: Point(3, 4)
print(repr(p)) # Output: Point(3, 4)
__len__(self)
:
Этот метод позволяет объектам определять свою длину. Обычно он используется для последовательностей, таких как списки или строки.
class MyList:
def __init__(self, items):
self.items = items
def __len__(self):
return len(self.items)
my_list = MyList([1, 2, 3, 4, 5])
print(len(my_list)) # Output: 5
__getitem__(self, key)
и__setitem__(self, key, value)
:
Эти методы позволяют получать доступ к объектам с помощью квадратных скобок ([]
), например к словарю или списку..
class MyDict:
def __init__(self):
self.data = {}
def __getitem__(self, key):
return self.data[key]
def __setitem__(self, key, value):
self.data[key] = value
d = MyDict()
d["key"] = "value"
print(d["key"]) # Output: value
__iter__(self)
и__next__(self)
:
Эти методы позволяют перебирать объекты с помощью цикла.__iter__
возвращает объект итератора, а__next__
извлекает следующий элемент из итератора.
class MyRange:
def __init__(self, stop):
self.stop = stop
self.current = 0
def __iter__(self):
return self
def __next__(self):
if self.current < self.stop:
value = self.current
self.current += 1
return value
else:
raise StopIteration()
r = MyRange(5)
for num in r:
print(num) # Output: 0, 1, 2, 3, 4
Методы dunder Python предоставляют мощный механизм для определения пользовательского поведения классов и объектов. Реализуя эти методы, вы можете сделать свой код более выразительным, интуитивным и Pythonic. Понимание и использование методов dunder может значительно улучшить ваши навыки проектирования объектов Python и взаимодействия с ними.