Определение класса Pybind11 - PullRequest
       12

Определение класса Pybind11

1 голос
/ 29 января 2020

В чем разница между следующими определениями классов в pybind11?

(1)

py::class_<Pet> pet(m, "Pet");

(2)

py::class_<Pet>(m, "Pet")

Какая польза от pet в pet(m, "Pet")? Я нашел это определение на странице 42 в разделе «5.8 Перечисления и внутренние типы» документации, которую можно найти здесь .

1 Ответ

2 голосов
/ 30 января 2020

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

Важно понимать, что все классы Python, функции, et c. конструкции во время выполнения. Т.е. некоторый Python код API должен вызываться для их создания, например, когда модуль загружен. Объект py::class_ вызывает API для создания класса Python и регистрации некоторой информации о типе для внутреннего использования pybind11 (например, для приведения позже). Т.е. это только рецепт создания запрошенного класса Python, а не сам этот класс. Как только класс Python создан и информация о его типе сохранена, объект рецепта больше не нужен и его можно безопасно уничтожить (например, b / c, выпустив его go из области видимости).

...