%module python_nondynamic /* Use the %pythonnondynamic directive to make the wrapped class a nondynamic one, ie, a python class that doesn't dynamically add new attributes. Hence, for the class %pythonnondynamic A; struct A { int a; int b; }; you will get: aa = A() aa.a = 1 # Ok aa.b = 1 # Ok aa.c = 3 # error Since "nondynamic" is a feature, if you use %pythonnondynamic; it will make all the wrapped class nondynamic ones. The implementation is based on the recipe: http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/252158 */ %pythonnondynamic A; %pythondynamic C; %inline %{ struct A { int a; int b; }; struct C { int a; int b; }; int retrieve_A_a(const struct A* self) { return self->a; } int retrieve_A_b(const struct A* self) { return self->b; } %} %inline %{ #ifdef SWIGPYTHON_BUILTIN int is_python_builtin() { return 1; } #else int is_python_builtin() { return 0; } #endif %}