Магический метод
__str__()
в Python используется для определения строкового представления объекта. Метод__str__()
вызывается функциямиstr()
,format()
иprint()
, когда они применяются к объекту.
Метод __str__()
является встроенным методом в Python, который может быть переопределен для пользовательских классов. Вот общий синтаксис этого метода:
class MyClass:
def __str__(self):
return "Возвращаемое строковое представление объекта"
По умолчанию, __str__()
возвращает строку, содержащую имя класса и его уникальный идентификатор. Вот пример:
class MyClass:
pass
obj = MyClass()
print(obj) # Вывод: <__main__.MyClass object at 0x7f315c573550>
Но мы можем переопределить __str__()
так, чтобы он возвращал более полезную информацию:
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})"
p = Person("Alice", 25)
print(p) # Вывод: Person(name=Alice, age=25)
Здесь __str__()
переопределен, чтобы возвращать строку, содержащую информацию о Person.
Методы __str__()
и __repr__()
в Python оба используются для создания строковых представлений объектов, но они слегка различаются:
__str__()
предназначен для создания читаемых пользователем строковых представлений объектов.__repr__()
предназначен для создания «официальных» строковых представлений, которые могут быть использованы для воссоздания объекта.Если __str__()
не определен для класса, Python будет использовать __repr__()
в качестве запасного варианта. В целом, рекомендуется определять __repr__()
для всех ваших классов и __str__()
для классов, которые имеют смысловое строковое представление.
Метод __str__()
используется не только функцией print()
, но и другими встроенными функциями и методами, такими как str()
, format()
. Это значит, что если вы переопределите __str__()
, вы сможете контролировать, как объекты вашего класса будут отображаться в различных контекстах.
__str__()
и исключения: Метод __str__()
также применяется для формирования сообщения об исключении. Когда вы создаете свой класс исключений, переопределение __str__()
позволяет предоставить более подробную информацию о проблеме.
class MyException(Exception):
def __init__(self, message, code):
super().__init__(message)
self.code = code
def __str__(self):
return f"{super().__str__()} (code: {self.code})"
try:
raise MyException("Something went wrong", 500)
except MyException as e:
print(e) # Вывод: "Something went wrong (code: 500)"
__str__()
и операции сравнения: Python предоставляет магические методы для сравнения объектов (__eq__
, __ne__
, __lt__
, __le__
, __gt__
, __ge__
). Но они не связаны с __str__()
непосредственно. Если вам нужно сравнивать объекты на основе их строкового представления, вы должны явно вызвать str()
или __str__()
.
Внутренние и внешние представления: Хотя __str__()
и __repr__()
часто возвращают похожие строки, важно помнить, что __str__()
предназначен для представления объекта в удобном для чтения виде (внешнее представление), а __repr__()
— для представления, которое можно использовать для воссоздания объекта (внутреннее представление).
__str__()
и наследование: Если вы определяете __str__()
в базовом классе, он будет доступен для всех подклассов. Однако подклассы могут переопределить __str__()
, чтобы изменить свое строковое представление.
Возвращаемые значения __str__()
: Важно, чтобы __str__()
всегда возвращал строку. Если __str__()
возвращает нестроковое значение, Python выдаст исключение TypeError. Это справедливо даже если __str__()
возвращает None
.
Магический метод __str__()
— это инструмент, который позволяет вам контролировать, как объекты ваших классов преобразуются в строки. Переопределяя __str__()
, вы можете сделать вывод ваших объектов более понятным и информативным, что может быть очень полезно при отладке и взаимодействии с пользователем.
Содержание: