
Параметр self в методе __str__ указывает на конкретный экземпляр класса и позволяет получить доступ к его атрибутам. Правильное использование self обеспечивает корректное формирование строкового представления, отражающего актуальное состояние объекта, без необходимости вручную извлекать данные.
Знание отличий между __str__ и __repr__ позволяет выбирать подходящий метод для разных задач: __str__ – для удобного отображения пользователю, __repr__ – для технического представления объекта, пригодного для восстановления экземпляра класса через код.
Назначение метода __str__ в Python

Основная задача __str__ – предоставить пользователю читаемый формат данных без необходимости вручную извлекать атрибуты объекта. Например, для класса Book метод может возвращать строку вида «Название: Python для анализа данных, Автор: Иванов», что упрощает отображение информации в интерфейсе или консоли.
Разница между __str__ и __repr__
Методы __str__ и __repr__ оба возвращают строковое представление объекта, но предназначены для разных целей. __str__ формирует читаемую строку для пользователя, акцентируя ключевые данные и упрощая восприятие, тогда как __repr__ ориентирован на разработчика и должен содержать точную информацию, позволяющую восстановить объект.
При вызове print() или str() используется __str__. Если метод не определен, Python автоматически применяет __repr__. Например, для класса Point __str__ может возвращать «Точка (x=10, y=20)», а __repr__ – «Point(x=10, y=20)», пригодную для копирования в код.
Если объект содержит много атрибутов, __repr__ должен включать все значимые поля, а __str__ – только те, которые нужны для быстрой идентификации объекта. Такая практика облегчает отслеживание состояния экземпляров без перегрузки информации.
Синтаксис определения __str__ с self
Метод __str__ определяется внутри класса и всегда принимает первым параметром self, который ссылается на текущий экземпляр. Стандартный синтаксис выглядит следующим образом:
class ClassName:
def __str__(self):
return "строковое представление объекта"
Основные правила при определении:
- self обязателен, без него Python не сможет получить доступ к атрибутам экземпляра.
- Метод всегда должен возвращать строку (str), другие типы вызов str() преобразует автоматически, но это может привести к ошибкам.
Пример использования f-строк:
class Book:
def __init__(self, title, author):
self.title = title
self.author = author
rubyCopy codedef __str__(self):
return f"Книга: {self.title}, Автор: {self.author}"
При таком определении вызов print(Book(«Python», «Иванов»)) автоматически отобразит читабельную информацию о объекте, без необходимости обращаться к атрибутам напрямую.
Возврат читаемого текста из __str__
Метод __str__ должен возвращать строку, которая ясно отражает ключевые атрибуты объекта. Для этого используют текстовое форматирование, позволяющее структурировать информацию и облегчить восприятие.
Рекомендации по формированию текста:
- Использовать f-строки для вставки значений атрибутов: f»Имя: {self.name}, Возраст: {self.age}».
- Включать только значимые поля, влияющие на идентификацию или состояние объекта.
- Избегать включения внутренних атрибутов, не предназначенных для пользователя.
Пример для класса User:
class User:
def __init__(self, name, email):
self.name = name
self.email = email
rubyCopy codedef __str__(self):
return f"Пользователь: {self.name}, Email: {self.email}"
Примеры использования __str__ в классах
Пример для класса Book:
class Book:
def __init__(self, title, author, year):
self.title = title
self.author = author
self.year = year
pythondef __str__(self):
return f"{self.title} ({self.year}) – Автор: {self.author}"
book = Book("Python для анализа данных", "Иванов", 2023)
Пример для класса BankAccount:
class BankAccount:
def __init__(self, number, balance):
self.number = number
self.balance = balance
pythonCopy codedef __str__(self):
return f"Счет №{self.number}, Баланс: {self.balance}₽"
account = BankAccount("1234567890", 5000)
Пример сравнения:
Класс
User
User object at 0x7f8a1c2b
Пользователь: Иван, Email: ivan@example.com
Book
Book object at 0x7f8a1c3d
Python для анализа данных (2023) – Автор: Иванов
Рекомендации по применению:
- Фокусироваться на ключевых атрибутах, чтобы информация была компактной и понятной.
Ошибки при неправильном использовании self в __str__
- Отсутствие self в параметрах метода: def __str__(): – вызовет TypeError, так как Python передает экземпляр автоматически.
- Обращение к несуществующим атрибутам через self: self.age, если атрибут не определен в __init__, вызывает AttributeError.
- Использование локальных переменных вместо self для формирования строки: данные не сохраняются в экземпляре и становятся недоступными для __str__.
Пример неправильного определения:
class User:
def __init__(self, name):
self.name = name
rubydef __str__(): # Ошибка: нет self
return f"Пользователь: {name}"
Правильная реализация:
class User:
def __init__(self, name):
self.name = name
rubyCopy codedef __str__(self):
return f"Пользователь: {self.name}"
Комбинирование __str__ с другими методами класса

Примеры комбинаций:
- С методами получения атрибутов:
class Product:
def __init__(self, name, price):
self.name = name
self.price = price
rubydef get_price_with_tax(self, tax):
return self.price * (1 + tax)
def __str__(self):
return f"{self.name}, Цена с налогом: {self.get_price_with_tax(0.2)}₽"
С методами обновления состояния объекта:
class Task:
def __init__(self, title, completed=False):
self.title = title
self.completed = completed
rubyCopy codedef mark_done(self):
self.completed = True
def __str__(self):
status = "Выполнена" if self.completed else "Не выполнена"
return f"Задача: {self.title}, Статус: {status}"
С методами форматирования или вспомогательными функциями:
class Person:
def __init__(self, first_name, last_name):
self.first_name = first_name
self.last_name = last_name
rubyCopy codedef full_name(self):
return f"{self.first_name} {self.last_name}"
def __str__(self):
return f"Имя: {self.full_name()}"
Использование других методов внутри __str__ делает строковое представление более гибким и поддерживаемым, особенно при изменении структуры класса или вычисляемых атрибутов.
Вопрос-ответ:
Что делает метод __str__ в Python и зачем он нужен?
Метод __str__ формирует строковое представление объекта, которое удобно читать при выводе через print() или преобразовании с помощью str(). Он позволяет отображать ключевые атрибуты экземпляра в удобной форме без необходимости напрямую обращаться к полям класса.
Чем __str__ отличается от __repr__?
__str__ создаёт читаемое для человека описание объекта, а __repr__ — более техническое представление, которое должно быть точным и, при возможности, позволять создать объект заново. При отсутствии __str__, Python использует __repr__ для вывода через print().
Как правильно использовать self в методе __str__?
Параметр self обязательно указывает на текущий экземпляр класса. Все атрибуты объекта должны вызываться через self. Например, return f"Имя: {self.name}". Без self метод не сможет получить доступ к данным экземпляра и вызовет ошибки типа TypeError или AttributeError.
Можно ли использовать другие методы класса внутри __str__?
Да, внутри __str__ можно вызывать другие методы класса для получения или форматирования данных. Например, метод, вычисляющий итоговую цену с налогом, можно использовать для формирования строки вывода: return f"Цена с налогом: {self.get_price_with_tax(0.2)}".
Какие ошибки чаще всего встречаются при реализации __str__?
Чаще всего встречаются: отсутствие self в параметрах метода, обращение к несуществующим атрибутам, использование локальных переменных вместо атрибутов экземпляра. Эти ошибки приводят к TypeError или AttributeError при попытке вывести объект.
Как метод __str__ влияет на отображение объектов в Python и зачем его использовать?
Метод __str__ определяет, как объект класса будет представлен в виде строки при выводе через print() или преобразовании с помощью str(). Он позволяет отображать ключевые атрибуты экземпляра в удобной форме, упрощая работу с объектами в консоли и логах. Например, для класса Book метод может возвращать строку вида "Python для анализа данных, Автор: Иванов", что сразу показывает название и автора книги без обращения к отдельным атрибутам. Без реализации __str__ Python использует __repr__, который может быть менее читаемым и содержать технические детали объекта.
