Hi Renato,
I've really appreciated your answer. It's solved my issue.
I will never find that I need to call base constructor explicitly.

Thank you,
Nodir

Renato Araujo <rena...@gmail.com> writes:

> 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
_______________________________________________
Cplusplus-sig mailing list
Cplusplus-sig@python.org
http://mail.python.org/mailman/listinfo/cplusplus-sig

Reply via email to