Интроспекция в Python

Интроспекция в Python

Python поддерживает полную интроспекцию (отражение) времени исполнения, в том числе интроспекцию типа (type introspection (англ.)). Это означает, что для любого объекта можно получить всю информацию о его внутренней структуре и среде исполнения. Возможности интроспекции можно условно разделить на две группы: стандартные (описанные в документации по языку (англ.)) и нестандартные (характерные для конкретной реализации языка, например, CPython).

Содержание

Примеры

Необходимые для интроспекции данные хранятся в специальных атрибутах. Так, например, получить все пользовательские атрибуты большинства объектов можно из специального атрибута — словаря (или объекта, предоставляющего dict интерфейс) __dict__

 >>> class x(object):pass
 ....
 >>> f = x()
 >>> f.attr = 12
 >>> print f.__dict__
 {'attr': 12}
 >>> print x.__dict__       # т.к. классы тоже являются экземплярами объекта type
                            # то и они поддерживают этот тип интроспекции
 {'__dict__': <attribute '__dict__' of 'x' objects>, '__module__'.......

Есть также другие атрибуты, имена и назначение которых зависят от объекта:

 >>> def f():pass
 ....
 >>> f.func_code.co_code    # получение байтокода функции
 'd\x00\x00S'
 >>> f.__class__            # специальный атрибут - ссылка на класс данного объекта
 <type 'function'>

Подавляющее большинство атрибутов, поддерживающих интроспекцию, являются классовыми, и их, в свою очередь, можно получить из obj.__class__.__dict__. Часть информации, унаследованную от базового класса, все объекты используют совместно, что позволяет экономить память.

Модуль inspect

Для удобства получения интроспективной информации в Python есть модуль inspect[1].

 >>> def f(x,y = 10,**mp):pass
 ...
 >>> inspect.getargspec(f)
 (['x', 'y'], None, 'mp', (10,))

Модуль new

С помощью модуля new возможен обратный процесс — построения объекта из составных частей на этапе исполнения

 >>> def f(i): return j + i
 ....
 >>> j = 2
 >>> f(1)
 3
 >>> import new
 >>> g = new.function(f.func_code, {'j': 23})
 >>> g(1)
 24

Примечания

  1. Beazley, 2009, pp. 222-225

Литература



Wikimedia Foundation. 2010.

Игры ⚽ Поможем сделать НИР

Полезное


Смотреть что такое "Интроспекция в Python" в других словарях:

  • Интроспекция в Питоне — Python поддерживает полную интроспекцию (отражение) времени исполнения, в том числе интроспекцию типа (type introspection(англ.)). Это означает, что для любого объекта можно получить всю информацию о его внутренней структуре и среде исполнения.… …   Википедия

  • Python — У этого термина существуют и другие значения, см. Python (значения). Python Класс языка: му …   Википедия

  • Интроспекция (программирование) — У этого термина существуют и другие значения, см. Интроспекция. Интроспекция (англ. type introspection) в программировании  возможность в некоторых объектно ориентированных языках определить тип и структуру объекта во время выполнения… …   Википедия

  • Стандартная библиотека Python — Богатая стандартная библиотека является одной из привлекательных сторон языка программирования Python. Здесь имеются средства для работы со многими сетевыми протоколами и форматами интернета, например, модули для написания HTTP серверов и… …   Википедия

  • Пайтон — Python Класс языка: функциональный, объектно ориентированный, императивный, аспектно ориентированный Тип исполнения: интерпретация байт кода, компиляция в MSIL, компиляция в байт код Java Появился в: 1990 г …   Википедия

  • Интерпретируемый язык программирования — язык программирования, в котором исходный код программы не преобразовывается в машинный код для непосредственного выполнения центральным процессором (как в компилируемых языках), а исполняется с помощью специальной программы интерпретатора. В… …   Википедия

  • GTK+ — Тип библиотека элементов интерфейса (виджетов) Автор The GTK+ …   Википедия

  • Отражение (программирование) — У этого термина существуют и другие значения, см. Отражение. Для улучшения этой статьи желательно?: Перевести текст с иностранного языка на русский. Н …   Википедия

  • Динамическая типизация — Типизация данных Типобезопасность Вывод типов Динамическая типизация Статическая типизация Строгая типизация Мягкая типизация Зависимые типы Утиная типизация Основная статья: Строгая типизация Динамическая типизация  приём, широко… …   Википедия

  • Objective-C — Класс языка: объектно ориентированный, мультипарадигмальный: рефлексивно ориентированный Появился в: 1986 Автор(ы): Бред Кокс Типизация данных: нестрогая, статическая / динамическая …   Википедия


Поделиться ссылкой на выделенное

Прямая ссылка:
Нажмите правой клавишей мыши и выберите «Копировать ссылку»