Cast into custom type
Henning Bredel
henning.bredel at gmx.de
Tue Nov 3 07:07:01 EST 2009
Diez, Gabriel, Steven,
thanks for your answers. I'll mainly give response in this posting, so
I hope not repeating myself.
On Tue, 03 Nov 2009 10:18:29 +0000, Steven D'Aprano wrote:
> On Tue, 03 Nov 2009 09:41:37 +0000, Henning Bredel wrote:
>
>> Now I'd like to call methods like `initialize(parent)' when the user
>> chooses to use a plugin. As described in the blog mentioned above, I
>> only have access to the general type called `PluginMount' (holding all
>> the actual plugin instances).
>>
>> I tried to define "abstract" methods in PluginMount type raising a
>> `NotImplementedError' but it seems, there is no late binding (similar
>> to Java), so the right method would be called.
>
> You need to give some actual examples of what you are trying to do, and
> what you are expecting to happen. How is initialized() being called?
Example: Assume a framework which offers common functionality for a plugin
or a module a user can choose at the beginning. The framework does not
know the concrete type of the plugin so it is possible to extend it by
implementing a well known interface or abstract class.
The framework reads the plugin directory, loads each module and creates
buttons for each plugin with a callback method for initializing. To use
common functionality of the framework, initialization method takes it as
the parent parameter.
I think this listing makes the most sense to you:
# initialize all plugins
self._plugin_modules = _load_plugins() # imp loading here
LOGGER.debug(ActionProvider.plugins) # print what was loaded
for plugin in ActionProvider.plugins: # create button for each
app_button = gtk.Button(plugin.title)
LOGGER.debug('Title of plugin: %s' % plugin.title)
app_button.connect("clicked",
plugin.initialize(plugin, self),
None)
self.set_canvas(app_button)
app_button.show()
>> TypeError: unbound method initialize() must be called with GeoCache
>> instance as first argument (got PluginMount instance instead)
>
> Sounds like you are calling initialize on the class instead of on an
> instance. I'm *guessing* that you are doing something like this:
Oh, I didn't expext PluginMount to hold only classes :/.
When calling `LOGGER.debug('Title of plugin: %s' % plugin.title)' the
global (not class attribute) `title' attribute is printed out though.
Probably some misinterpretation, too ..?!
> (1) Change the for-loop to:
>
> for cls in plugin_manager.plugins:
> cls().initialize(plugin_Manager)
Good guess .. but calling it in that way another error says
app_button.connect("clicked", plugin().initialize(self), None)
TypeError: __init__() takes exactly 2 arguments (1 given)
But also
app_button.connect("clicked", plugin().initialize(plugin, self), None)
TypeError: __init__() takes exactly 2 arguments (1 given)
That is strange, because neither initialize() nor __init__ of the
plugin is called .. only a logging statement shall print a msg.
I hope it got a bit clearer what I am intended to do.
Thanks for your help.
Henning
More information about the Python-list
mailing list