'''class_<>''' statement constructs python class object. Usually it's included in BOOST_PYTHON_MODULE to wrap C++ class: {{{ class A { ... }; BOOST_PYTHON_MODULE(example) { class_("A"); } }}} Also it can be used explicitly to create class instances from C++: {{{ BOOST_PYTHON_MODULE(example1) { object class_a = class_("A"); object instance_a = class_a(); } }}} If you want to forbid creating class instancies from python, you now must pass `no_init` to class_<> definition. Default, as in python, will be init with no arguments. There is no limit to number of init<>'s in the boost.python. '''Abstract class''' Pure virtual (abstract) class shall be wrapped with {{{ class_< Abstract , boost::noncopyable>("Abstract", no_init); }}} Because if you don't tell it that class is noncopyable, Boost.Python tries to register a converter for handling wrapped functions which handle function returning values of class type. Naturally, this has to be able to copy construct the returned C++ class object into storage that can be managed by a Python object. Since this is an abstract class, that fails. '''C++ object storage''' Boost.Python allows you to specify how Python objects will hold the C++ objects they wrap. You can specify that they be held by ''shared_ptr'' (or any other smart pointer), in which case the library will generate converters to/from Python for ''shared_ptr''. The ''to_python converters'' will simply build a new Python object around the ''shared_ptr<>''. You can specify that your C++ object is held by ''shared_ptr''. That allows you to hold a U object for dispatching, yet still pass shared_ptrs around in your C++ code. If you have virtual functions you want to ''override in Python'', you actually have to hold the T object with a derived class U which overrides the virtual functions to dispatch back to Python. In this case, class U naturally has to have access to the Python object There are several problems with the above arrangement, but the most important one is that if you keep the shared_ptr alive longer than its corresponding Python object, calls to the Python-overridable virtual functions will crash, because they'll try to call through an invalid pointer. '''Synopsis:''' {{{ class_("A") .def(init()) .def(...) ; class_("B", init()) .def(...) ; class_("C", "C's docstring", init()) .def(...) ; class_("D", "D's docstring", init(), "__init__ doc") .def(...) ; class_("E") .def(...) ; class_("F", no_init) .def(...) ; class_("G", "G's docstring", no_init) .def(...) ; class_("H", "H's docstring") .def(...) ; }}}