- Интроспекция в 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
Примечания
- ↑ Beazley, 2009, pp. 222-225
Литература
- Патрик О'Брайен Руководство по интроспекции на Python / Intersoft Lab.
- David M. Beazley Python Essential Reference. — 4th Edition. — Addison-Wesley Professional, 2009. — 717 с. — ISBN 978-0672329784
Для улучшения этой статьи по информационным технологиям желательно?: - Дополнить статью (статья слишком короткая либо содержит лишь словарное определение).
- Найти и оформить в виде сносок ссылки на авторитетные источники, подтверждающие написанное.
- Проставив сноски, внести более точные указания на источники.
- Викифицировать статью.
Категории:- Концепции языков программирования
- Python
Wikimedia Foundation. 2010.