Adding and attribute to an instance

J jstier at cs.uvic.ca
Tue Aug 9 23:38:44 CEST 2005


Hi,


I am trying to add new data attributes to my extension classes from
within a script. I am under the impression that python allows
that implicity


This is the definition of my class

PyTypeObject CmdPlace::PyType =
{
    PyObject_HEAD_INIT(NULL)
    0,                              /*ob_size*/
    "Place",                        /*tp_name*/
    sizeof(CmdPlace::PyStruct),     /*tp_basicsize*/
    0,                              /*tp_itemsize*/
    0,                              /*tp_dealloc*/
    0,                              /*tp_print*/
    0,                              /*tp_getattr*/
    0,                              /*tp_setattr*/
    0,                              /*tp_compare*/
    0,                              /*tp_repr*/
    0,                              /*tp_as_number*/
    0,                              /*tp_as_sequence*/
    0,                              /*tp_as_mapping*/
    0,                              /*tp_hash */
    0,                              /*tp_call*/
    0,                              /*tp_str*/
    PyObject_GenericGetAttr,        /*tp_getattro*/
    PyObject_GenericSetAttr,        /*tp_setattro*/
    0,                              /*tp_as_buffer*/
    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /*tp_flags*/
    "CmdPlace",                     /* tp_doc */
    0,		                        /* tp_traverse */
    0,		                        /* tp_clear */
    0,		                        /* tp_richcompare */
    0,		                        /* tp_weaklistoffset */
    0,		                        /* tp_iter */
    0,		                        /* tp_iternext */
    CmdPlace::sPyMethods,           /* tp_methods */
    CmdPlace::sPyMembers,           /* tp_members */
    CmdPlace::sPyGetSeters,         /* tp_getset */
    0,                              /* tp_base */
    0,                              /* tp_dict */
    0,                              /* tp_descr_get */
    0,                              /* tp_descr_set */
    0,                              /* tp_dictoffset */
    0,                              /* tp_init */
    0,                              /* tp_alloc */
    0,                              /* tp_new */
};

I call

    PyType_Ready(&PyType);
    Py_INCREF(&PyType);

to initialize the type, and

    PyObject_INIT((PyObject*)&mPyObject, &CmdPlace::PyType);

to initialize an object. Objects of this type are only ever
instantiated from C++. When I evaluate a sript I just add the object as
"MyObject" to the dicitonary passed to Py_Eval... All the
members and methods work fine, but when I do

MyObject.aNewAttribue = 12

I get at an error saying

object has no attribute "aNewAttribue".

I have looked at some of the source code in PyObject_GenericGetAttr and
it turns out that the object has no dictionary. It seens that the
address of the dictionary is computed somehow via tp_dictoffset in the
type object.

Basically my question is, how can I make this work.


Cheers
Jochen




More information about the Python-list mailing list