Магические методы в Python – это специальные методы, которые значительно облегчают использование объектов. Вы легко узнаете их в коде классов, потому что они заключены в двойные подчеркивания "__". Например. __in it__, является одним из тех самых "волшебных" методов в Python. Поскольку они характеризуются двойным подчеркиванием, их также часто называют "dunders", что означает Double Under.
Они не предназначены для прямого вызова вами или пользователем вашего класса, однако их вызов происходит внутри класса при определенном действии. Например, мы явно не вызываем метод __init__ при создании нового объекта класса, но вместо этого этот метод вызывается внутренне. Все, что нам нужно сделать, это определить метод внутри класса таким образом, чтобы он имел смысл для нашего проекта.
Есть много различных "магических" методов, которые вы можете использовать, но в этой статье мы сосредоточимся на некоторых из них.
Инициализация объекта: __init__
Когда объект создается, он инициализируется путем вызова метода __init__.
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
>>> person = Person('Andrew', 15)
>>> person
<__main__.Person instance at 0x10d580638>
При вызове метода __init__ объект (в данном случае person) передается как self. Другие аргументы, используемые в вызове метода, передаются в качестве остальных аргументов функции.
Репрезентация объекта: __str_, __repr__
Помните, в предыдущем примере, когда мы хотели вывести person, интерпретатор вернул нам <__main__.Person instance at 0x10d580638>?
Давайте рассмотрим следующий пример:
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def __str__(self):
return "Person: {}, Age: {}".format(self.name, self.age)
>>> person = Person('Andrew', 25)
>>> print(person)
Person: Andrew, Age: 25
Вот теперь стало лучше. Мы вернули представление класса в виде строки. Есть также похожий метод __repr__: возвращает однозначное текстовое представление (representation) объекта полезное для отладки или же сообщений об ошибках.
Хорошо прослеживается разница между __str__ и __repr__ данном примере:
>>> from datetime import date
>>> date.today() # __repr__
datetime.date(2020, 10, 8)
>>> print(date.today()) # __str__
2020-10-8
А на этом всё, всем спасибо за внимание. Ставьте лайки, оставляйте комментарии. Пока!