Dynamic Classes in Python
Jump to navigation
Jump to search
DynamicClassFactory.py
#!/usr/bin/env python ## ## Factory for dynamic classes ## $Id: DynamicClassFactory.py 1.1 1997/10/27 13:07:23 gandalf Exp $ ## $Log: DynamicClassFactory.py $ ## Revision 1.1 1997/10/27 13:07:23 gandalf ## Initial revision ## ## __doc__ = """ Factory class for dynamic classes. Support a generate a object instance and receive a methods or class instance addClasses Add a DynamicClass'es into factory _addClasses same, but accept a tuple addClass Add a single DynamicClass delClass delete a single class delClasses delete few classes getMethod Return a 'pointer' to method by 'Class.method' __getitem__ Return a class instance __call__ Return a object instance """ class DynamicClassFactory: def __init__(self, *_dynclasses): self.__dclasses__ = {} self.__dclassinst__ = {} self._addClasses(_dynclasses) def _addClasses(self, _dynclasses): for i in _dynclasses: self.addClass(i) def addClasses(self, *_dynclasses): for i in _dynclasses: self.addClass(i) def addClass(self, _dynclass): self.__dclasses__[_dynclass.name()] = _dynclass _dynclass.setFactory(self) self.__dclassinst__[_dynclass.name()] = _dynclass.do() __add__ = addClass def delClass(self, _name): try: del self.__dclasses__[_name] del self.__dclassesinst__[_name] except KeyError: return def delClasses(self, *_names): for i in _names: self.delClass(i) def getMethod(self, _pointer): import string _cla_nam = string.split(string.strip(_pointer), '.') if len(_cla_nam) < 2: return None try: return self.__dclassinst__[_cla_nam[0]].__dict__[_cla_nam[1]] except (KeyError, AttributeError): return None def __getitem__(self, key): return self.__dclassinst__[key] def __call__(self, key, *args, **kw): return apply(self[key],args,kw)
DynamicClass.py
#!/usr/bin/env python ## ## Dynamic Class - we will be create it dynamicaly :) ## $Id: DynamicClass.py 1.2 1997/10/27 13:01:30 gandalf Exp $ ## $Log: DynamicClass.py $ ## Revision 1.2 1997/10/27 13:01:30 gandalf ## Add a __doc__ string ## ## Revision 1.1 1997/10/27 12:58:49 gandalf ## Initial revision ## ## import new __doc__ = """ This class are collect a description of dynamic class and generate a class instance setFactory set a DynamicClassFactory for this DynamicClass do generate class instance name return classname """ class DynamicClass: def __init__(self, _classname, _methods = {}, _vars={},_baseclasses = (), _docstring=''): self.__classname__ = _classname self.__classdict__ = _methods self.__vars__ = _vars self.__baseclasses__ = _baseclasses self.__docstring__ = _docstring self.__factory__ = None def setFactory(self, _factory): self.__factory__ = _factory def do(self): import string _odct = {'__name__':self.__classname__,'__doc__':self.__docstring__} for i in self.__vars__.keys(): _odct[i] = self.__vars__[i] _unbounds = [] for i in self.__classdict__.keys(): _mod_nam = string.split(string.strip(self.__classdict__[i]), '!') if len(_mod_nam) < 2: _odct[i] = self.__factory__.getMethod(self.__classdict__[i]) if _odct[i] == None: del _odct[i] continue try: exec ('import %s'%_mod_nam[0]) except ImportError: continue try: exec ("_odct[i] = %s.%s"%(_mod_nam[0],_mod_nam[1])) except AttributeError: continue _bcrec = () for i in self.__baseclasses__: _bcrec = _bcrec + (self.__factory__[i],) #print _odct,_bcrec return new.classobj(self.__classname__, _bcrec, _odct) def name(self): return self.__classname__