0Pricing
Python Academy · Урок

Магические методы: __str__ и __repr__

Реализуйте специальные методы для удобного представления объектов.

«Магические методы: __str__ и __repr__» — бесплатный урок Python Academy на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Python Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Python Academy содержит 4 уроков всего.

Что такое магические методы

Магические методы — это специальные методы с двойными подчёркиваниями, которые Python вызывает в определённых контекстах, например при выводе или сравнении.

class Foo:
    def __str__(self):
        return "I am Foo"

f = Foo()
print(f)        # I am Foo
print(str(f))   # I am Foo

__repr__: представление для разработчика

__repr__ должен возвращать однозначную строку, которая в идеале позволяет воссоздать объект. Она отображается в REPL и используется функцией repr().

class Point:
    def __init__(self, x, y):
        self.x = x
        self.y = y

    def __repr__(self):
        return f"Point({self.x}, {self.y})"

p = Point(3, 4)
print(repr(p))  # Point(3, 4)

__str__: представление для пользователя

__str__ предоставляет понятное человеку строковое представление. Функции print() и str() вызывают его. Если он отсутствует, Python использует __repr__ как запасной вариант.

class Temperature:
    def __init__(self, celsius):
        self.celsius = celsius

    def __str__(self):
        return f"{self.celsius}°C"

    def __repr__(self):
        return f"Temperature({self.celsius})"

t = Temperature(100)
print(t)        # 100°C
print(repr(t))  # Temperature(100)

Когда вызывается каждый из них

__str__: print(), str(), f-строки. __repr__: REPL, repr(), контейнеры, отображающие свои элементы.

class Item:
    def __str__(self): return "str"
    def __repr__(self): return "repr"

x = Item()
print(x)         # str
print([x])       # [repr]  ← list uses repr for elements

__format__ для пользовательского форматирования

Определите __format__, чтобы управлять отображением объекта в f-строках с указателями формата.

class Money:
    def __init__(self, amount):
        self.amount = amount

    def __format__(self, spec):
        if spec == "usd":
            return f"${self.amount:.2f}"
        return str(self.amount)

m = Money(9.5)
print(f"{m:usd}")  # $9.50

__bool__ для проверки истинности

__bool__ позволяет вычислять объект в логических контекстах. Возвращайте True или False.

class Bag:
    def __init__(self, items):
        self.items = items

    def __bool__(self):
        return len(self.items) > 0

b = Bag([])
if not b:
    print("Bag is empty")  # Bag is empty

__len__ для len()

__len__ делает возможным вызов len(obj). Если __bool__ не определён, этот метод также используется им.

class Stack:
    def __init__(self):
        self.data = []

    def push(self, v): self.data.append(v)

    def __len__(self):
        return len(self.data)

s = Stack()
s.push(1)
print(len(s))  # 1

__eq__ для проверки равенства

Определите __eq__, чтобы задать условие равенства двух экземпляров при использовании ==.

class Vector:
    def __init__(self, x, y):
        self.x, self.y = x, y

    def __eq__(self, other):
        return self.x == other.x and self.y == other.y

print(Vector(1,2) == Vector(1,2))  # True

Связь __hash__ с __eq__

При определении __eq__ Python устанавливает для __hash__ значение None, делая объект нехешируемым. Если объект должен использоваться в множествах или словарях, определите также __hash__.

class Point:
    def __init__(self, x, y): self.x, self.y = x, y
    def __eq__(self, o): return (self.x, self.y) == (o.x, o.y)
    def __hash__(self): return hash((self.x, self.y))

pts = {Point(1,2), Point(1,2)}
print(len(pts))  # 1

__add__ и арифметика

Арифметические операторы соответствуют специальным методам: __add__ — оператору +, __sub__ — оператору - и т. д.

class Vector:
    def __init__(self, x, y): self.x, self.y = x, y
    def __add__(self, o): return Vector(self.x+o.x, self.y+o.y)
    def __repr__(self): return f"Vector({self.x},{self.y})"

print(Vector(1,2) + Vector(3,4))  # Vector(4,6)

__getitem__ для индексации

__getitem__ позволяет использовать в классе индексацию в квадратных скобках, например obj[key].

class Matrix:
    def __init__(self, data):
        self.data = data

    def __getitem__(self, idx):
        return self.data[idx]

m = Matrix([[1,2],[3,4]])
print(m[0])     # [1, 2]
print(m[1][0])  # 3

Быстрая проверка

Какой специальный метод вызывается при использовании print(obj)?

Повторение

Магические методы придают классам идиоматичное для Python поведение. __repr__ предназначен для разработчиков, а __str__ — для пользователей. Определяйте __eq__, __hash__ и арифметические специальные методы, чтобы объекты обладали полной функциональностью.

Часто задаваемые вопросы

Урок «Магические методы: __str__ и __repr__» бесплатный?

Да — полный текст урока «Магические методы: __str__ и __repr__» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Python Academy, подпишись на CoddyKit PRO. Курс Python Academy содержит 4 уроков всего.

Чему я научусь в уроке «Магические методы: __str__ и __repr__»?

Реализуйте специальные методы для удобного представления объектов. Ты практикуешь Python Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Python Academy?

Предыдущий опыт не требуется. Python Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 4.

Сколько времени занимает урок «Магические методы: __str__ и __repr__»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Python Academy?

Да. Каждый урок Python Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Классы и метод __init__
  2. Атрибуты экземпляра и класса
  3. Методы экземпляра и self
  4. Магические методы: __str__ и __repr__
← Назад к Python Academy