【发布时间】:2014-04-04 08:30:31
【问题描述】:
我想知道在使用 PyCxx 生成的 python 扩展中定义属性的正确方法是什么。
目前我已经创建了一个Py::PythonClass 的子类,就像官方的example 一样。
我在初始化函数中添加了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 中声明属性。使用上面的代码访问属性,但我希望在打印对象的属性和方法时也列出它,就像在不使用 PyCXX 时定义
tp_getset时的情况一样。 -
好的,我现在使用
PyGetSetDef()添加属性声明。唯一的障碍是访问tp_getset变量(受保护),但我现在将PythonType的子类定义为助手。