# Когда использовать какой магический метод
В 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 соответственно.
Заключение
Надеюсь, это объяснение было ясным и понятным
Несколько заключительных слов
Если эта история была полезной и вы хотите оказать небольшую поддержку, вы можете:
- Похлопайте 50 раз за эту историю (мне это очень-очень помогает)
- Подпишитесь на членство в 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