Я создал getsetters для публичной переменной number_bananas В моем классе Box . number_bananas является общедоступным, потому что коробка разблокирована, любой может съесть бананы или положить больше в коробку.
Вот мой тип PyBox:
typedef struct
{
PyObject_HEAD
Box *bx;
} PyBox;
В моей коробкекласс, который я определил:
class Box {
public:
Box(double l, double b, double h);
int number_bananas;
...
Box::Box(double l, double b, double h)
{
number_bananas = 11;
length = l;
breadth = b;
height = h;
}
и вот определенные мной методы get / setter:
static PyObject *pyBox_getBananas(PyBox *self, void *closure)
{
Py_INCREF(self->bx->number_bananas);
return self->bx->number_bananas;
}
static int pyBox_setBananas(PyBox *self, PyObject *value, void *closure)
{
if (value == NULL) {
PyErr_SetString(PyExc_TypeError, "You're trying to put something that is not a banana!!");
return -1;
}
Py_DECREF(self->bx->number_bananas);
Py_INCREF(value);
self->bx->number_bananas = value;
return 0;
}
static PyGetSetDef pyBox_getseters[] = {
{"number_bananas", (getter)pyBox_getBananas, (setter)pyBox_setBananas, "number of bananas", NULL},
{NULL}
};
Конструктор, который я использовал для создания экземпляра класса Box, определяется следующим образом:
static int pyBox_init(PyObject *self, PyObject *args, PyObject *kwds)
{
static char* nams[] = {"length","breadth","height", NULL};
int l, b, h;
if(!PyArg_ParseTupleAndKeywords(args, kwds, "iii", nams, &l, &b, &h))
return -1;
((PyBox *)self)->bx = &(Box::Box(l,b,h));
return 0;
}
static PyObject *pyBox_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
{
PyBox *self;
self = (PyBox *) type->tp_alloc(type, 0);
return (PyObject *)self;
}
Модуль успешно компилируется.Однако я не могу найти, как получить доступ к свойству number_bananas из Python.
Следующие результаты приводят к фатальной ошибке (segfault):
import adventureIsland
bo = adventureIsland.box(1,1,1)
print(bo.number_bananas)
Итак ... мойВопрос в том, как мне получить доступ / установить number_bananas из Python?
Спасибо!