Возможности[править | править код] Модули и пакеты[править | править код]
Программное обеспечение (приложение или библиотека) на Python оформляется в виде модулей, которые в свою очередь могут быть собраны в пакеты. Модули могут располагаться как в каталогах, так и в ZIP-архивах. Модули могут быть двух типов по своему происхождению: модули, написанные на «чистом» Python, и модули расширения (extension modules), написанные на других языках программирования. Например, в стандартной библиотеке есть «чистый» модуль pickle и его аналог на Си: cPickle. Модуль оформляется в виде отдельного файла, а пакет — в виде отдельного каталога. Подключение модуля к программе осуществляется оператором import. После импорта модуль представлен отдельным объектом, дающим доступ к пространству имён модуля. В ходе выполнения программы модуль можно перезагрузить функцией reload().
Интроспекция[править | править код]
Python поддерживает полную интроспекцию времени исполнения[97]. Это означает, что для любого объекта можно получить всю информацию о его внутренней структуре.
Применение интроспекции является важной частью того, что называют pythonic style, и широко применяется в библиотеках и фреймворках Python, таких как PyRO, PLY, Cherry, Django и др., значительно экономя время использующего их программиста.
Необходимые для интроспекции данные хранятся в специальных атрибутах. Так, например, получить все пользовательские атрибуты большинства объектов можно из специального атрибута — словаря (или другого объекта, предоставляющего интерфейс dict) __dict__
>>> class x(object):pass
....
>>> f = x()
>>> f.attr = 12
>>> print(f.__dict__)
{'attr': 12}
>>> print(x.__dict__) # т.к. классы тоже являются экземплярами объекта type
# то и они поддерживают этот тип интроспекции
{'__dict__': , '__module__'.......
Есть также другие атрибуты, имена и назначение которых зависят от объекта:
>>> def f():pass
....
>>> f.func_code.co_code # получение байтокода функции
'd\x00\x00S'
>>> f.__class__ # специальный атрибут - ссылка на класс данного объекта
Подавляющее большинство атрибутов, поддерживающих интроспекцию, является классовым, и их, в свою очередь, можно получить из obj.__class__.__dict__. Часть информации, унаследованную от базового класса, все объекты используют совместно, что позволяет экономить память.
Для удобства получения интроспективной информации в Python есть модуль inspect[98].
>>> def f(x,y = 10,**mp):pass
...
>>> inspect.getargspec(f)
(['x', 'y'], None, 'mp', (10,))
С помощью модуля 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
Do'stlaringiz bilan baham: |