Зачем нужен метод dir() для объектов в Python?

«Зачем нужен метод dir() для объектов в Python?» — вопрос из категории Python, который задают на 26% собеседований Data Scientist / ML Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Метод dir() используется для интроспекции — получения списка допустимых атрибутов и методов объекта. Это ключевой инструмент для исследования структуры неизвестных модулей, классов или объектов во время разработки и отладки.

Основные сценарии использования:

  1. Исследование объектов: Быстро понять, что можно сделать с объектом.
  2. Отладка: Проверить, какие атрибуты были установлены.
  3. Интерактивная работа: В REPL (Python shell, Jupyter) для изучения API.

Примеры:

# 1. Исследование встроенного объекта
my_list = [1, 2, 3]
print(dir(my_list))  # Покажет методы: append, pop, sort, __len__ и т.д.

# 2. Исследование пользовательского класса
class MyClass:
    """Простой класс для демонстрации."""
    class_attr = "I am a class attribute"

    def __init__(self, value):
        self.instance_attr = value

    def show(self):
        return self.instance_attr

obj = MyClass(42)

# dir() покажет ВСЕ атрибуты: унаследованные, методы, пользовательские
attributes = dir(obj)
print("class_attr" in attributes)   # True
print("instance_attr" in attributes) # True
print("show" in attributes)         # True
print("__init__" in attributes)     # True

# 3. dir() без аргументов возвращает имена в текущей локальной области видимости
def test_function():
    local_var = "hidden"
    print(dir())  # Выведет: ['local_var']

test_function()

Важные детали:

  • dir() возвращает отсортированный список строк.
  • Он вызывает внутренний метод объекта __dir__(), который можно переопределить для кастомного поведения.
  • Список включает не только пользовательские атрибуты, но и все унаследованные методы и специальные (dunder) методы (__str__, __dict__ и т.д.).
  • Для более детального изучения часто используют help() для документации или obj.__dict__ для просмотра только пространства имен экземпляра.