Магические методы для интроспекции
Python является очень выразительным языком, в дизайне языка есть множество возможностей, чтобы сделать работу с объектами визуально удобной и управлять их самопрезентацией. Для этого есть целый набор методов и свойств, которые позволяют многое узнать об объекте.
__str__(self)
: Определяет поведение объекта, когда он вызывается как параметр функции str()
__repr__(self)
: Определяет поведение объекта, когда он вызывается как параметр функции repr(). Согласно договоренности, результат, который возвращает функция repr(obj) должен быть таким чтобы его можно было скопировать, вставить как код и вызвать, чтобы создать похожий объект.
Пример:
class Point:
def __init__(self, x, y, space=None):
self.x = x
self.y = y
self.space = space
p = Point(1, 2, space="yolo")
print(repr(p))
# <__main__.Point object at 0x1103d3250>
class PointNice:
def __init__(self, x, y, space=None):
self.x = x
self.y = y
self.space = space
def __repr__(self):
return f"PointNice({self.x}, {self.y}, space='{self.space}')"
p2 = PointNice(1, 2, space="new space")
print(repr(p2))
# PointNice(1, 2, space='new space')
__dir__(self)
: Еще один метод, помогающий в интроспекции. Если вызывать функцию dir(), то она будет искать метод __dir__ у объекта. Метод должен вернуть список атрибутов объекта. Обычно его не нужно реализовывать. Но если объект переопределяет поведение методов __getattr__ или __getattribute__, или сам динамически генерирует атрибуты, то этот метод поможет управлять процессом.
__doc__
: На самом деле это не метод, а свойство объекта. В нем хранится строка документации объекта. Когда вызывается функция help(obj), то она считывает эту документацию и формирует подсказку. Этим свойством можно управлять и переназначать. Особенно это удобно если добавить декоратор к функции, и чтобы не потерять документацию декорируемой функции, то свойство можно считать и пере присвоить функции, которую возвращает декоратор.