On Sun, Sep 25, 2005 at 11:24:04PM +0200, Christoph Haas wrote: > Dear coders... > > I'm working on an application that is supposed to support "plugins". > The idea is to use the plugins as packages like this: > > Plugins/ > __init__.py > Plugin1.py > Plugin2.py > Plugin3.py > > When the application starts up I want to have these modules loaded > dynamically. Users can put their own plugin modules into the > Plugins/ directory and the application should know about it. > > Each plugin is supposed to be a class derived from a general > "Plugin" superclass. I just don't know how to 'register' every > plugin.
If you want every class that defines the Plugin class to be registered a metaclass will get you there. Here is one that I use. class Register(type): """A tiny metaclass to help classes register themselves automagically""" def __init__(cls, name, bases, dict): if ('register' in dict): # initial dummy class setattr(cls, 'register', staticmethod(dict['register'])) elif (getattr(cls, 'DO_NOT_REGISTER', 0)): # we don't want to register this non-concrete class delattr(cls, 'DO_NOT_REGISTER') elif (object not in bases): cls.register(name, cls) return class Plugin(object): __metaclass__ = Register all_plugins = [] def register(name, cls): all_plugins.append(cls) return Plugin.all_plugins will be a list of all the classes that inherit from Plugin (and that don't have a DO_NOT_REGISTER attribute). -jackdied -- http://mail.python.org/mailman/listinfo/python-list