Инспекция объектов Python: доступ к методам и свойствам
Быстрый ответ
Если вам необходимо изучить атрибуты объекта в Python, воспользуйтесь функцией dir()
. Чтобы получить значения этих атрибутов, примените getattr()
:
obj = YourObject()
attributes = [attr for attr in dir(obj) if not attr.startswith('__')] # исключаем системные атрибуты
for attr in attributes:
print(f"{attr}:", getattr(obj, attr))
Такой подход исключает системные методы, позволяя сосредоточиться на атрибутах, определённых пользователем, и обеспечивая общий обзор структуры объекта.
Подробнее о самоанализе объекта
Давайте начнём с основ и проникнем глубже в самоанализ объекта.
К какому типу ты принадлежишь?
С помощью type()
мы можем узнать класс объекта, что позволит нам лучше понять, какие операции поддерживает данный объект:
print(type(obj)) # Вывод: <class '__main__.YourObject'>
Открой мне свои секреты
Функция vars()
позволяет вам пропустить этап создания списка в функции dir()
и сразу обратиться к __dict__
объекта:
print(vars(obj)) # Вывод: {'attr': значение, ...}
Есть ли у тебя данный ключ?
Прежде чем запрашивать атрибут, который, возможно, отсутствует, проверим его наличие с помощью функции hasattr()
, чтобы избежать ошибки AttributeError:
if hasattr(obj, 'attr'):
print(getattr(obj, 'attr')) # Вывод: значение
Можем ли мы тебя вызвать?
Функция callable()
проверяет, возможно ли обращение к объекту, как к функции:
if callable(obj):
result = obj()
Заглянем за кулисы
Изучаем глобальные и локальные пространства имен при помощи функций globals()
и locals()
, крайне полезных при отладке кода:
print(globals()) # Вывод глобального пространства имен
print(locals()) # Вывод локального пространства имен
Нужнa дополнительная помощь?
Функция help()
поможет нам при проведении исследования по модулям, классам и функциям:
help(obj)
Визуализация
Представим себе, что изучение объекта в Python — это работа детектива, исследующего некий таинственный чемодан:
Py-Объект: Внутри {'attr1': value1, 'method1': <function>...}
Детектив:
🕵️♂️ Рассмотрим ближе 🔍
- **dir()**: Что содержит этот чемодан?
- **type()**: Кто его производитель?
- **id()**: Его уникальный серийный номер
- **getattr()**: Доступ к отдельным вещам в чемодане
Таким образом, все тайные закоулки объекта становятся обнаженными перед нами!
Продвинутая эксплуатация модуля inspect
Модуль inspect
представляет собой набор инструментов для глубинного анализа объектов. С его помощью можно изучить функции и прочитать исходный код объекта:
- С функцией
inspect.getmembers()
можно найти все атрибуты объекта:
import inspect
print(inspect.getmembers(obj))
- Отфильтруем атрибуты и найдем только методы с помощью
inspect.isfunction()
илиinspect.ismethod()
:
methods = [m for m in inspect.getmembers(obj, predicate=inspect.isfunction)]
- Определяем требуемые параметры для вызова функции с помощью
inspect.signature()
:
print(inspect.signature(obj.some_method))
Исследование исходного кода
Функция inspect.getsource()
позволяет нам увидеть исходный код функции:
print(inspect.getsource(obj.method))
Всемогущий dict
В __dict__
скрыты атрибуты объекта. Давайте исследуем их:
print(obj.__dict__)
Полезные материалы
- Официальная документация Python модуля inspect — подробное ознакомление с модулем inspect.
- Понятие атрибута
__dict__
в Python — детальный анализ__dict__
в объектах Python. - Примеры практического использования функции vars() в Python — применение vars() для доступа к словарю объекта.
- Методы управления атрибутами объектов в Python: getattr(), setattr(), hasattr() — инструкция по работе с атрибутами объектов.
- Использование функции type() в Python для самоанализа — методы использования type() для исследования объектов.
- Детальное руководство по работе с PyCFunction — обзор функций C в Python согласно документации Python 3.12.1 C API.