Hi Nodir,
I saw a problem in your exemple. But I did not know if is this your problem, but try call the base constructor in your "PyTestPlugin" constructor, like that: > class PyTestPlugin(IBasePlugins): > def __init__(self): IBasePlugins.__init__(self) <<<<<<<<<<<<<<< here this need be called explicitly > self.handle_type = 2 > def canHandle(self, type): > return type == handle_type > def handle(self): > print "handle() from python plugin" BR Renato Araujo Oliveira Filho On Fri, Aug 7, 2009 at 3:54 PM, Nodir GULYAMOV<gelv...@gmail.com> wrote: > Hello All, > I am trying to implement plug-ins system using BOOST Python but a little > stuck. I've read documentation a couple of times and have feeling that > missed something pretty simple. > Below simplified version what I am trying to do: > > // abstract Base interface class > class IBasePlugins > { > public: > virtual ~IBasePlugins() {}; > virtual bool canHandle(int type) = 0; > virtual void handle() = 0; > }; > > //some C++ internal plugin (no need to expose to python) > class IntrPlugin : public IBasePlugins > { > public: > IntrPlugin() : handle_type(1) {} > bool canHandle(int type) { > return type == handle_type; > } > void handle() { > std::cout << "handle() from internal plugin" << std::endl; > } > private: > int handle_type; > }; > > > // class to manage plug-ins > > typedef boost::shared_ptr<IPlugins> PluginsPtrType; > typedef vector<PluginsPtrType> VPluginsType; > > class PluginsMgr > { > public: > static void register(PluginsPtrType plugin) { > vplugins.puch_back(plugin); > } > static void run(int type) { > VPluginsType::iterator it; > for(it = vplugins.begin(); it != vplugins.end(); it++) > if( (*it)->canHandle(type) ) (*it)->handle(); > } > private: > VPluginsType vplugins; > }; > > // export to python > struct IBasePluginsWrap : public IBasePlugins { > IBasePluginsWrap(PyObject* self_): self(self_) {} > bool canHandle(int type) { > return call_method< bool >(self, "canHandle", type); > } > void handle() { > call_method< void >(self, "handle"); > } > > PyObject* self; > }; > > BOOST_PYTHON_MODULE(pyPlugins) > { > class_< IBasePlugins, IBasePluginsWrap, boost::noncopyable > >("IBasePlugins") > .def("canHandle", pure_virtual(&IBasePlugins::canHandle)) > .def("handle", pure_virtual(&IBasePlugins::handle)) > ; > > class_< PluginsMgr >("PluginsMgr") > .def("registerPlugin", &PlgMgr::registerPlugin) > .staticmethod("registerPlugin") > .def("run", &PlgMgr::run) > .staticmethod("run") > ; > > register_ptr_to_python<PluginsPtrType>(); > } > > > Then I am using it from python as follows: > > from pyPlugins import * > > class PyTestPlugin(IBasePlugins): > def __init__(self): > self.handle_type = 2 > def canHandle(self, type): > return type == handle_type > def handle(self): > print "handle() from python plugin" > > > pm = PluginsMgr() > testplg = PyTestPlugin() > pm.registerPlugin(testplg) > > And have error that C++ signature mismatch. > > Thank you in advance. I will really appreciate any help. > > Kind regards, > Nodir > _______________________________________________ > Cplusplus-sig mailing list > Cplusplus-sig@python.org > http://mail.python.org/mailman/listinfo/cplusplus-sig > _______________________________________________ Cplusplus-sig mailing list Cplusplus-sig@python.org http://mail.python.org/mailman/listinfo/cplusplus-sig