# Когда использовать какой магический метод

В Python у нас есть два встроенных метода, __str__ и __repr__, которые позволяют нам определять строковое представление объектов. Хотя оба метода на первый взгляд кажутся похожими, у них есть важные отличия, которые стоит понимать.

Метод __str__

Метод str — это встроенный метод, который возвращает строковое представление объекта. Когда этот метод вызывается, он должен возвращать удобочитаемую строку, описывающую объект.

class MyClass:
    def __str__(self):
        return "This is a MyClass object"

my_object = MyClass()
print(my_object)       # This is a MyClass object

^ метод __str__ вызывается, когда мы используем встроенную функцию str() или функцию print() для объекта.

class TestClass:
    pass        # we didn't define __str__ here

testobject = TestClass()

print(testobject)      # <__main__.TestClass object at 0x10f580c90>

^ и наоборот, если мы не определим метод __str__, будет вызван метод по умолчанию__str__. И печатает какую-то странную тарабарщину.

Метод __repr__

Метод __repr__ — это встроенный метод, который возвращает строковое представление объекта. Когда этот метод вызывается, он должен возвращать строку, представляющую объект таким образом, чтобы его можно было использовать для воссоздания объекта. В идеале строка должна быть однозначной и полной.

class MyClass:
    def __repr__(self):
        return "MyClass()"

my_object = MyClass()

print(repr(my_object))       # MyClass()

^ метод __repr__ вызывается, когда мы используем встроенную функцию repr() для объекта. Здесь он печатает MyClass(). В идеале, если мы скопируем и вставим это в наш код, для воссоздания этого объекта потребуется минимальное или нулевое усилие.

class Dog:
    def __init__(self, name, age, breed):
        self.name = name
        self.age = age
        self.breed = breed

    def __repr__(self):
        return f'Dog("{self.name}", {self.age}, "{self.breed}")'

dog = Dog("rocky", 4, "german shepherd")

print(repr(dog))

# Dog("rocky", 4, "german shepherd")

Обратите внимание, что в этом более сложном примере возвращенная строка Dog("rocky", 4, "german shepherd") может быть скопирована в наш скрипт Python для воссоздания объекта.

Когда использовать __str__

Вы должны использовать __str__, когда хотите отобразить объект в удобочитаемом формате. Например, вы можете использовать __str__ для:

  • Вывести объект на консоль
  • Записывать состояние объекта в файл
  • Отобразить объект в графическом интерфейсе

Когда использовать __repr__

Вы должны использовать __repr__, когда хотите воссоздать объект. Например, вы можете использовать __repr__ для:

  • Отладка приложения путем печати состояния объекта
  • Сохранение состояния объекта в файл
  • Сериализировать объект в строку или JSON

Примеры кода

Чтобы лучше понять разницу между __str__ и __repr__, давайте рассмотрим простой пример:

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def __str__(self):
        return f"Person(name={self.name}, age={self.age})"

    def __repr__(self):
        return f"Person(name='{self.name}', age={self.age})"

person = Person("John Doe", 30)

print(str(person))         # Person(name=John Doe, age=30)
print(repr(person))        # Person(name='John Doe', age=30)

В этом примере вы можете увидеть, как методы __str__ и __repr__ используются для отображения удобочитаемого и однозначного строкового представления объекта Person соответственно.

Заключение

Надеюсь, это объяснение было ясным и понятным

Несколько заключительных слов

Если эта история была полезной и вы хотите оказать небольшую поддержку, вы можете:

  1. Похлопайте 50 раз за эту историю (мне это очень-очень помогает)
  2. Подпишитесь на членство в Medium, используя мою ссылку (5 долларов в месяц, чтобы читать неограниченное количество историй на Medium)

Настройка моего домашнего офиса: https://zlliu.co/workspace

Мой LinkedIn: https://www.linkedin.com/in/zlliu/

Мои электронные книги: https://zlliu.co/books

  • 40 практических вопросов по Python [для начинающих] — БЕСПЛАТНО
  • 20 практических вопросов по рекурсии — БЕСПЛАТНО
  • Python от нуля к единице — БЕСПЛАТНО
  • 30 практических вопросов по Python [средний уровень] — https://payhip.com/b/dG4u3
  • 30 практических вопросов по Python [для продвинутых] — https://payhip.com/b/CGUB8
  • Python One To Two (Часть 1) — https://payhip.com/b/UCeJn
  • 40 вопросов по практике регулярных выражений — https://payhip.com/b/nb2Cg