Перейти к содержанию

Магические методы для интроспекции

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), то она считывает эту документацию и формирует подсказку. Этим свойством можно управлять и переназначать. Особенно это удобно если добавить декоратор к функции, и чтобы не потерять документацию декорируемой функции, то свойство можно считать и пере присвоить функции, которую возвращает декоратор.