__repr__
должен возвращать строку, однозначно представляющую объект.
Для логирования это полезно тем, что строка, возвращаемая __repr__
, может быть использована для воспроизведения объекта, например, через eval()
.
В логах это позволяет точно понять, какой объект был залогирован и его состояние.
class MyClass: def __init__(self, x, y): self.x = x self.y = y def __repr__(self): return f"MyClass(x={self.x}, y={self.y})"При логировании объекта
MyClass
будет выведена строка, содержащая значения его атрибутов: MyClass(x=10, y=20)
. Это гораздо полезнее, чем просто <__main__.MyClass object at 0x...>
.
Метод __repr__
– это специальный метод в Python, который предназначен для создания "официального" строкового представления объекта. Он вызывается, когда вы используете функцию repr()
или когда объект отображается в интерактивной оболочке Python без явного преобразования в строку.
Для целей логирования, __repr__
особенно полезен, поскольку он должен возвращать строку, которая, по возможности, может быть использована для воссоздания объекта. Это означает, что строка должна содержать достаточно информации, чтобы однозначно идентифицировать объект.
Вот как можно использовать __repr__
для логирования:
Реализация __repr__
в вашем классе:
class MyClass:
def __init__(self, name, value):
self.name = name
self.value = value
def __repr__(self):
return f"MyClass(name='{self.name}', value={self.value})"
Использование __repr__
при логировании:
import logging
logging.basicConfig(level=logging.DEBUG)
obj = MyClass("Example", 42)
logging.debug(f"Объект: {repr(obj)}") # Явное использование repr()
logging.debug(f"Объект: {obj!r}") # Использование !r для вызова repr()
logging.debug("Объект: %r", obj) # Использование %r для форматирования строк
Преимущества использования __repr__
для логирования:
__repr__
позволяет получить полную информацию о состоянии объекта, что полезно для отладки.__repr__
, может быть использовано для воссоздания объекта, что облегчает отладку и анализ проблем.__repr__
обеспечивает согласованный формат логирования объектов вашего класса.Когда следует использовать __str__
вместо __repr__
:
Метод __str__
предназначен для создания "неофициального" или "пользовательского" строкового представления объекта. Он вызывается функцией str()
и используется, когда объект необходимо представить в более удобочитаемом формате для конечного пользователя. Для логирования, особенно в целях отладки, __repr__
обычно предпочтительнее, так как предоставляет больше информации, необходимой для анализа состояния объекта.
Пример различий:
class Point:
def __init__(self, x, y):
self.x = x
self.y = y
def __repr__(self):
return f"Point(x={self.x}, y={self.y})"
def __str__(self):
return f"({self.x}, {self.y})"
p = Point(1, 2)
print(repr(p)) # Вывод: Point(x=1, y=2)
print(str(p)) # Вывод: (1, 2)
В заключение, __repr__
– это мощный инструмент для создания строковых представлений объектов, которые идеально подходят для целей логирования и отладки, поскольку он предоставляет детальную информацию о состоянии объекта.