Ответ
В Python для интроспекции (просмотра) атрибутов объекта используются несколько встроенных функций, каждая со своей спецификой.
1. dir(obj) — полный список атрибутов
Возвращает отсортированный список имен всех атрибутов объекта, включая унаследованные от родительских классов и служебные (например, __init__). Полезно для общего обзора всех доступных методов и полей.
class MyClass:
class_var = 10
def __init__(self):
self.instance_var = 20
obj = MyClass()
print(dir(obj))
# Выведет ['__class__', ..., 'class_var', 'instance_var']
2. vars(obj) или obj.__dict__ — атрибуты экземпляра
Возвращают словарь __dict__, содержащий только атрибуты, принадлежащие конкретному экземпляру объекта (его состояние). Это не включает атрибуты класса или унаследованные.
# Продолжение предыдущего примера
print(vars(obj))
# Выведет: {'instance_var': 20}
print(obj.__dict__)
# Выведет: {'instance_var': 20}
3. getattr(obj, 'attribute_name') — доступ по имени
Получает значение атрибута по его имени, переданному в виде строки. Незаменимо, когда имя атрибута определяется динамически в ходе выполнения программы.
attr_name = 'instance_var'
print(getattr(obj, attr_name)) # 20
Ключевые отличия:
dir(): для исследования всех доступных имен в объекте.vars()/__dict__: для получения словаря с атрибутами только этого экземпляра.getattr(): для динамического доступа к значению конкретного атрибута по строковому имени.