在PyCXX扩展中定义属性的正确方法是什么

时间:2014-04-04 08:30:31

标签: python c++ pycxx

我想知道在PyCxx生成的python扩展中定义属性的正确方法是什么。 目前,我已经在官方example中创建了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属性未被列出。我怎么能改变它?

1 个答案:

答案 0 :(得分:0)

PyCXX开发人员Barry Scott提供了一个简单的解决方案。 诀窍在于,当调用__members__时,python会在getattr( const char *_name )中询问dir()的值。在这种情况下,可以返回包含属性名称作为字符串的Py::List对象。