【问题标题】:How can I use PyObject_IsInstance with a non-builtin class as second argument?如何使用带有非内置类的 PyObject_IsInstance 作为第二个参数?
【发布时间】:2012-08-05 17:21:06
【问题描述】:

在 C/C++ 中,我想查看 PyObject 是否是一个实例。不幸的是,PyInstance_Check 宏不适用于新式类。

所以,根据我阅读的论坛帖子,PyObject_IsInstance 可以解决问题。但是,我发现的所有示例都展示了与内置类型(如整数和字符串)的比较。

我想知道如何构造一个代表一个类型的类的 PyObject,这样我就可以将它传递给PyObject_IsInstance 的第二个参数。你能帮帮我吗?

【问题讨论】:

    标签: python c instance pyobject


    【解决方案1】:

    我自己终于找到了答案,根据那个页面的内容:Create instance of a python class , declared in python, with C API

    // PyInstance_Check works only for old-style classes.
    qBool isInstance = PyInstance_Check(pyInstance);
    if (!isInstance)
    {
        // It might be an instance of a new-style class.
        //
        PyRef module = PyImport_ImportModule("module.where.myclass.is");
        PyObject* moduleDict = PyModule_GetDict(module.Get());
        PyObject* protocolClass = PyDict_GetItemString(moduleDict, "MyClass");
    
        int returnValue = PyObject_IsInstance(pyObject, protocolClass);
    }
    

    【讨论】:

    • 为什么不直接调用PyObject_GetAttrString() 而不是PyModule_GetDict() + PyDict_GetItemString() 呢?此外,PyRef 不在 Python/C-API 参考中。它是从哪里来的?
    【解决方案2】:

    如果在同一模块中定义,您可以使用相应的PyTypeObject。如果从您要使用PyObject_IsInstance 的位置看不到类型对象(假设它称为ProtocolType),请首先声明一个原型:

    extern PyTypeObject ProtocolType;
    

    然后像这样使用它:

    PyObject_IsInstance(object, reinterpret_cast<PyObject*>(&ProtocolType))
    

    【讨论】:

    • reinterpret_cast 是 C++,问题标记为 C。使用 C 风格的转换。
    猜你喜欢
    • 2018-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-13
    相关资源
    最近更新 更多