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

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

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

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.

 >>> 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

Wikimedia Foundation. 2010.

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

Полезное


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

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

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


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

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