Как правильно определить атрибуты в расширении PyCXX?

0

Интересно, как правильно определить атрибуты в расширении python, сгенерированном с помощью PyCxx. В настоящее время я создал подкласс Py::PythonClass как в официальном примере. Я добавил behaviors().supportGetattro(); в функции инициализации и создал простое переопределение

Py::Object getattro( const Py::String &name_ )
{
    std::string name( name_.as_std_string( "utf-8" ) );

    if( name == "name" )
    {
        return m_name;
    }
    else
    {
        return genericGetAttro( name_ );
    }
}

Все идет нормально. В python я получаю правильное значение с obj.name, но единственное, что делает меня ненасытным, это то, что при вызове dir(obj) атрибут name не попадает в список. Как я могу это изменить?

  • 0
    Возможно вопрос должен быть, как объявить атрибуты в PyCXX. Доступ к атрибуту работает с приведенным выше кодом, но я хочу, чтобы он также отображался при печати атрибутов и методов объекта, как это имеет место при определении tp_getset когда tp_getset не используется.
  • 0
    Хорошо, теперь я добавляю объявления атрибутов с помощью PyGetSetDef() . Единственным препятствием является получение tp_getset переменной tp_getset (защищено), но теперь я определяю подкласс PythonType как вспомогательный.
Теги:

1 ответ

0
Лучший ответ

Барри Скотт, разработчик PyCXX, любезно предоставил простое решение. Фокус в том, что python запрашивает значение __members__ в getattr( const char *_name ) при вызове dir(). В этом случае можно вернуть объект Py::List содержащий имена атрибутов в виде строк.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню