Создайте экземпляр класса Python New Style для встраивания в C++.

Я работаю с PyObject над встраиванием части кода python в C++. Я нашел решение, которое хорошо работает с python 2.7, используя PyInstance_New для создания экземпляра Python. Но это не работает с классами Python нового стиля, которые выглядят так.

    class B(object): 
      def __init__(self, name): 
        self.name = name

      def print_name(lastName): 
        print self.name + " " + lastName

В моем старом коде (python 2.7) определение класса не наследуется от класса объекта, и я создаю свой экземпляр для вызова метода print_name, подобного этому. P.S. имя файла A.py.

    PyObject *import, *attr, *instance, *methodcall, *arg, *tuple;
    arg = PyString_FromString("hello"); 
    tuple = PyTuple_Pack(1, arg);  

    import = PyImport_ImportModule("A"); 
    attr = PyObject_GetAttrString(import, "B");
    instance = PyInstance_New(attr, arg, NULL); 

    methodcall = PyObject_CallMethod(instance, (char *) "print_name", (char *) "(s)", (char *) "Bill"); 

Но приведенный выше код больше не работает, потому что в новом python 3.x type(class) возвращает object вместо instance. Теперь я получаю эту ошибку.

плохой аргумент для внутренней функции.

Любая помощь приветствуется. Спасибо.


person pseudo    schedule 31.10.2016    source источник
comment
Возможный дубликат Создайте объект с помощью Python C API   -  person All Workers Are Essential    schedule 17.11.2016
comment
Как следует из связанного вопроса и Barpaum, вы должны сделать: instance = PyObject_CallObject(attr /*the class*/, tuple /*args in tuple*/);   -  person All Workers Are Essential    schedule 17.11.2016


Ответы (1)


Я не уверен, работает ли это для вас. Но я предлагаю вам попробовать. Просто используйте «PyObject_CallObject» для инициализации экземпляра, затем используйте «PyObject_CallMethod» для вызова метода экземпляра.

person Barpaum    schedule 17.11.2016