Магические методы python repr

Магические методы __str__, __repr__, __len__, __abs__

На этом занятии я расскажу о, так называемых, магических методах, которые определены в каждом классе и записываются через два подчеркивания вначале и в конце имен, например, так:

Как я говорил, их еще называют

dunder-методами (от англ. сокращения double underscope)

  • __str__() – магический метод для отображения информации об объекте класса для пользователей (например, для функций print, str);
  • __repr__() – магический метод для отображения информации об объекте класса в режиме отладки (для разработчиков).
class Cat: def __init__(self, name): self.name = name

При выводе cat, увидим служебную информацию: Если нам нужно ее как-то переопределить и отобразить в другом виде (формате), то, как раз для этого используются магические методы __str__ и __repr__. Давайте для начала переопределим метод __repr__ и посмотрим, как это отразится на выводе служебной информации о классе:

def __repr__(self): return f": "

Обратите внимание, этот метод должен возвращать строку, поэтому здесь записан оператор return и формируемая строка. Что именно возвращать, мы решаем сами, в данном случае – это название класса и имя кошки. Переопределим измененный класс Cat. И, смотрите, теперь при создании экземпляра мы видим другую информацию при его выводе: : Васька Как раз то, что определили в магическом методе __repr__. То же самое увидим и при использовании функции print и str. По идее, здесь должен отрабатывать другой магический метод __str__, но так как он у нас еще не переопределен, то автоматически выполняется метод __repr__. Давайте добавим второй магический метод __str__ и посмотрим, как это повлияет на отображение данных:

по-прежнему будем видеть служебную информацию от метода __repr__. Однако, если выполнить отображение экземпляра класса через print или str, то будет срабатывать уже второй метод __str__. Вот в этом отличие этих двух магических методов.

Читайте также:  Html new line in div

Магические методы __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) )

Источник

Оцените статью