【问题标题】:What is the proper way to define attributes in a PyCXX extension在 PyCXX 扩展中定义属性的正确方法是什么
【发布时间】: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 的子类定义为助手。

标签: python c++ pycxx


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-11-05
    • 1970-01-01
    • 2020-08-18
    • 1970-01-01
    • 2013-07-24
    • 2013-08-09
    • 2020-02-13
    相关资源
    最近更新 更多