Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Внутри CPython гид по интерпретатору Python.pdf
Скачиваний:
4
Добавлен:
07.04.2024
Размер:
8.59 Mб
Скачать

Объекты и типы

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

lst = list()

А можно воспользоваться квадратными скобками:

lst = []

Строки могут создаваться на основе строковых литералов при помощи одинарных или двойных кавычек. В главе «Грамматика и язык Python» были представлены грамматические определения, которые заставляют компилятор интерпретировать двойные кавычки как строковый литерал.

Все типы в Python наследуются от встроенного базового типа object, даже строки, кортежи и списки.

В файле Objects object.c находится базовая реализация типа object, написанная на чистом C. В ней содержатся некоторые конкретные реализации базовой логики (например, поверхностное сравнение1).

Можно считать, что объект Python состоит из двух частей:

1.Базовая модель данных с указателями на скомпилированные функции.

2.Словарь с нестандартными атрибутами и методами.

1 Поверхностное сравнение — сравнение объектов без проверки того, являются ли они одним и тем же объектом и указывают ли на один и тот же адрес памяти. Проще говоря, сравнение значений объектов. — Примеч. ред.

Книги для программистов: https://t.me/booksforits

Примеры этой главы    261

Большая часть базового API объекта объявляется в Objects object.c, как и реализация встроенной функции repr(), PyObject_Repr. Также здесь можно найти PyObject_Hash() и другие API.

Все эти функции могут переопределяться в пользовательских объектах с помощью реализации соответствующих dunder-методов для объектов Python:

class MyObject(object):

def __init__(self, id, name): self.id = id

self.name = name

def __repr__(self):

return "<{0} id={1}>".format(self.name, self.id)

Эти встроенные функции в совокупности называются моделью данных Python1. Не все методы в объекте Python являются частью модели данных, что позволяет объектам Python содержать как атрибуты классов и экземпляров, так и методы.

СМ. ТАКЖЕ

Один из лучших источников информации омодели данных Python— книга Лучано Рамальо (Luciano Ramalho) «Fluent Python».

ПРИМЕРЫ ЭТОЙ ГЛАВЫ

Вэтой главе объяснение каждого типа будет сопровождаться примером.

Впримере мы реализуем оператор «почти равно», созданный в предшествующих главах.

Если вы еще не внесли изменения, которые были описаны в главах, посвященных грамматике CPython и компилятору, обязательно вернитесь и сделайте это, прежде чем читать дальше. Это необходимо для реализации рассматриваемых примеров.

1 https://docs.python.org/3/reference/datamodel.html.

Книги для программистов: https://t.me/booksforits

262    Объекты и типы

ВСТРОЕННЫЕ ТИПЫ

Базовая модель данных определяется в PyTypeObject, а функции определяются в Objects typeobject.c.

Каждый из исходных файлов имеет соответствующий заголовок в Include. Например, Objects/rangeobject.c имеет заголовочный файл Include rangeobject.h.

Ниже приведен список исходных файлов и соответствующих им типов.

ИСХОДНЫЙ ФАЙЛ

ТИП

Objects object.c

Встроенные методы и базовый объект

Objects boolobject.c

Тип bool

Objects bytearrayobject.c

Тип byte[]

Objects bytesobject.c

Тип bytes

Objects cellobject.c

Тип cell

Objects classobject.c

Абстрактный тип class, используемый в метапрограм-

 

мировании

Objects codeobject.c

Встроенный тип объекта code

Objects complexobject.c

Тип комплексного числа

Objects iterobject.c

Тип итератора

Objects listobject.c

Тип list

Objects longobject.c

Числовой тип long

Objects memoryobject.c

Базовый тип памяти (объект memoryview)

Objects methodobject.c

Тип метода класса

Objects moduleobject.c

Тип модуля

Objects

Тип пространства имен

namespaceobject.c

 

Objects odictobject.c

Тип упорядоченного словаря

Objects rangeobject.c

Тип генератора диапазона (range)

Objects setobject.c

Тип set

Objects sliceobject.c

Тип ссылки на срез

Книги для программистов: https://t.me/booksforits

Типы объектов    263

ИСХОДНЫЙ ФАЙЛ

ТИП

Objects structseq.c

Тип struct.Struct

Objects tupleobject.c

Тип tuple

Objects typeobject.c

Тип type

Objects unicodeobject.c

Тип str

Objects weakrefobject.c

Тип weakref

Некоторые типы будут рассмотрены в этой главе.

ТИПЫ ОБЪЕКТОВ

Так как C в отличие от Python не является объектно-ориентированным языком1, объекты C не наследуются друг от друга. PyObject определяет исходный сегмент данных для любого объекта Python, а PyObject * представляет ссылку на него.

При определении типов Python typedef использует один из двух макросов:

1.PyObject_HEAD (PyObject) для простых типов.

2.PyObject_VAR_HEAD (PyVarObject) для контейнерных типов.

Для простого типа PyObject содержит следующие поля:

ПОЛЕ

ТИП

НАЗНАЧЕНИЕ

ob_refcnt

Py_ssize_t

Счетчик ссылок на экземпляр

ob_type

_typeobject*

Тип объекта

Например, cellobject объявляет одно поле ob_ref в дополнение к базовым:

typedef struct {

PyObject_HEAD

PyObject *ob_ref; /* Содержимое ячейки или NULL для пустой ячейки */

} PyCellObject;

1 https://realpython.com/python3-object-oriented-programming/.

Книги для программистов: https://t.me/booksforits