Магические методы __str__, __repr__, __len__, __abs__
На этом занятии я расскажу о, так называемых, магических методах, которые определены в каждом классе и записываются через два подчеркивания вначале и в конце имен, например, так:
Как я говорил, их еще называют
dunder-методами (от англ. сокращения double underscope)
- __str__() – магический метод для отображения информации об объекте класса для пользователей (например, для функций print, str);
- __repr__() – магический метод для отображения информации об объекте класса в режиме отладки (для разработчиков).
class Cat: def __init__(self, name): self.name = name
При выводе cat, увидим служебную информацию:
def __repr__(self): return f": "
Обратите внимание, этот метод должен возвращать строку, поэтому здесь записан оператор return и формируемая строка. Что именно возвращать, мы решаем сами, в данном случае – это название класса и имя кошки. Переопределим измененный класс Cat. И, смотрите, теперь при создании экземпляра мы видим другую информацию при его выводе:
по-прежнему будем видеть служебную информацию от метода __repr__. Однако, если выполнить отображение экземпляра класса через print или str, то будет срабатывать уже второй метод __str__. Вот в этом отличие этих двух магических методов.
Магические методы __len__ и __abs__
- __len__() – позволяет применять функцию len() к экземплярам класса;
- __abs__() — позволяет применять функцию abs() к экземплярам класса.
class Point: def __init__(self, *args): self.__coords = args
А, далее, по программе нам бы хотелось определять размерность координат с помощью функции len(), следующим образом:
Если сейчас запустить программу, то увидим ошибку, так как функция len не применима к экземплярам классов по умолчанию. Как вы уже догадались, чтобы изменить это поведение, можно переопределить магический метод __len__() и в нашем случае это можно сделать так:
def __len__(self): return len(self.__coords)
Смотрите, мы здесь возвращаем размер списка __coords и если после этого запустить программу, то как раз это значение и будет выведено в консоль. То есть, магический метод __len__ указал, что нужно возвращать, в момент применения функции len() к экземпляру класса. Как видите, все просто и очевидно. Следующий магический метод __abs__ работает аналогичным образом, только активируется в момент вызова функции abs для экземпляра класса, например, так:
Опять же, если сейчас выполнить программу, то увидим ошибку, т.к. функция abs не может быть напрямую применена к экземпляру. Но, если переопределить магический метод:
def __abs__(self): return list( map(abs, self.__coords) )
Python магические методы
В этой части учебника мы рассмотрим что такое в Python магические методы класса, это достаточна важная тема, но лёгкая.
Что такое магические методы:
Для начала разберём что такое эти магические методы, если кратко говоря, то это базовые методы, которые можно назначить любому классу.
Например в Python относится таким методам, метод __init__() или __del__() , которые мы разбирали в части про конструкторы.
Python магические методы класса:
Стоит сказать, что я не буду показывать их все, так как их очень много но расскажу основные механики их использования.
Для начала покажу вам наверное самый популярный магический метод, это __str__() , суть его заключается в том, что он генерирует строку, которая будет использоваться при выведи в консоль и не только.
Вот пример использования этого метода:
Как видите мы тут в методе __str__() возвращаем строку с маркой нашей машины и скоростью, и более того всё это обозначили.
После мы создаём объект класса Car и выводим его, вот что у нас получиться:
Как видите он нам вывел то, что мы хотели, таким образом можно использовать __str__() .
Также подобные этому методы есть __int__() , __float__() их используют при выведи объекта виде целых чисел и сплававшей точкой соответственно.
Например когда для объекта использую функцию int() , при выведи, и т.д..
Ещё есть подобные методы, но только для арифметических действий, например __add__(), он нужен для сложения.
Вот не большой пример его использования:
Как видите мы принимаем ещё один аргумент, я его назвал a, он равен тому числу, с которым мы будем складывать, как видите мы тут складываем скорость.
Вот что получиться если мы выведем в консоль значение во время сложения:
Мы использовали для вывода эту команду print(bmv+100) и как видите получилось 300, это всё потому что мы прибавляем к скорости и возвращаем только скорость, а не всё, поэтому у нас вывелось текущие значение этого параметра.
Также есть и другие арифметические методы:
- __sub__() — Вычитание;
- __mul__() — Умножение;
- __truediv__() — Деление (x/y);
- __floordiv__() — Целочисленное деление (x // y);
- __mod__() — Остаток от деления;
- __pow__() — Возведение в степень;
Опять же это только основные методы которые есть, там ещё есть специальные для битовых операций или логических.
Вывод:
В этой части учебника вы прочитали что такое в Python магические методы класса и основы работы с ними, думаю это было полезно.