Le lundi 14 août 2006 09:33, Jackson a écrit : > Now I realize this would drive a programmer crazy...because a Lion might > have a roar() method whereas a Human might have a holler() method. But > so long as the user knew which argument they passed in, it shouldn't be > too difficult to keep track of it.
There are many problems if you go that way. One implementation could be : In [28]: class Animal(object) : ....: _types = {} ....: ....: In [29]: class Worker(object) : ....: def work(self) : print 'hard' ....: ....: In [30]: def createLion(*classes) : ....: def roar(self) : print "roar" ....: if not classes in Animal._types : ....: Animal._types[classes] = type('Lion', (Animal,) + classes, {'roar' : roar}) ....: return Animal._types[classes]() ....: In [31]: In [31]: createLion().roar() roar In [32]: type(createLion()) Out[32]: <class '__main__.Lion'> In [33]: type(createLion()) is type(createLion()) Out[33]: True In [34]: createLion(Worker).roar() roar In [35]: createLion(Worker).work() hard In [36]: type(createLion(Worker)) Out[36]: <class '__main__.Lion'> In [37]: type(createLion(Worker)) is type(createLion(Worker)) Out[37]: True In [38]: Animal._types Out[38]: {(): <class '__main__.Lion'>, (<class '__main__.Worker'>,): <class '__main__.Lion'>} In [39]: type(createLion(Worker)) is type(createLion()) Out[39]: False The main problems are : first, your classes definition are hidden, second there is no real Lion class to test, say isinstance(createLion(toto), Lion), this can be misleading. What you are trying to achieve is more commonly done by agregation and delegation : In [47]: class Lion(Animal) : ....: def __init__(self, *classes) : ....: self._objects = tuple(c() for c in classes) ....: def isA(self, class_) : ....: return class_ in (type(o) for o in self._objects) ....: def __getattr__(self, name) : ....: for obj in self._objects : ....: try: return getattr(obj, name) ....: except: pass ....: raise AttributeError('not defined or found in objects "%s"' % name) ....: ....: In [48]: Lion().work() --------------------------------------------------------------------------- exceptions.AttributeError Traceback (most recent call last) /home/maric/<ipython console> /home/maric/<ipython console> in __getattr__(self, name) AttributeError: not defined or found in objects "work" In [49]: Lion().isA(Worker) Out[49]: False In [50]: Lion(Worker).isA(Worker) Out[50]: True In [51]: Lion(Worker).work() hard -- _____________ Maric Michaud _____________ Aristote - www.aristote.info 3 place des tapis 69004 Lyon Tel: +33 426 880 097 -- http://mail.python.org/mailman/listinfo/python-list