Интересно, как правильно определить атрибуты в расширении 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
атрибут не попадает в список. Как я могу это изменить?
Барри Скотт, разработчик PyCXX, любезно предоставил простое решение.
Хитрость в том, что питон запрашивает значение __members__
в getattr( const char *_name )
при звонке dir()
, В этом случае можно вернуть Py::List
объект, содержащий имена атрибутов в виде строк.
Других решений пока нет …