<br><br><div class="gmail_quote">El 13 de octubre de 2010 07:42, Juan Ignacio <span dir="ltr"><<a href="mailto:euribates@gmail.com">euribates@gmail.com</a>></span> escribió:<br><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
<div class="gmail_quote"><div class="im"><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;"><div bgcolor="#FFFFFF"><div><span>¿tendría que mantener a mano ese diccionario o hay forma de hacer que se cree automáticamente?</span></div>
</div><br></blockquote></div><div>La idea es que se cree y gestione automaticamente, claro. He estado mirando las Metaclases (que es un concepto donde estoy bastante perdido, pero sigo luchando) y se podría hacer algo así::</div>
<div><br></div><div>-[ Cortar por aqui ]---------------------------------------</div><div><div>class Base(type):</div><div> Catalogo = {}</div><div><br></div><div> def __new__(cls, name, bases, dct):</div><div> new_class = type.__new__(cls, name, bases, dct)</div>
<div> Base.Catalogo[name] = new_class</div><div> return new_class</div><div><br></div><div>def instance_object_of_class(class_name, *args):</div><div> return Base.Catalogo[class_name](*args)</div><div><br>
</div><div>class A1():</div><div> __metaclass__ = Base</div><div> def __str__(self): return 'Soy de la clase A1'</div><div><br></div><div>class A2():</div><div> __metaclass__ = Base</div><div> def __str__(self): return 'Soy de la clase A2'</div>
<div><br></div><div>class B1():</div><div> __metaclass__ = Base</div><div> def __str__(self): return 'Soy de la clase B1'</div><div><br></div><div>class B2():</div><div> __metaclass__ = Base</div><div><br>
</div><div> def __init__(self, value):</div><div> self.value = value</div><div><br></div><div> def __str__(self): return 'Soy de la clase B2, value vale %s' % self.value</div><div><div>-[ Cortar por aqui ]---------------------------------------</div>
<div></div></div><div><br></div><div>Por ejemplo:</div><div><br></div><div>>>> a1 = instance_object_of_class('A1')</div><div>>>> print a1</div><div>Soy de la clase A1</div><div><br></div><div>>>> a2 = instance_object_of_class('A2')</div>
<div>>>> print a2</div><div>Soy de la clase A2</div><div><br></div><div>>>> b1 = instance_object_of_class('B1')</div><div>>>> print b1</div><div>Soy de la clase B1</div><div><br></div><div>
>>> b2 = instance_object_of_class('B2', 23)</div><div>>>> print b2</div></div><div>Soy de la clase B2, value vale 23</div><div><br></div><div>Lo unico que habria que hacer es incluir la referencia a la metaclase "Base" con la variable mágica __metaclass__ en la declaración de cada clase. Habría que codificar también un mensaje de error</div>
<div>por si se intentar definir dos clases con el mismo nombre, ahora mismo la mas nueva machacaría a la</div><div>mas antigua.</div><div><br></div></div>
</blockquote></div><br><br>Hola,<br><br>contesto con varias semanas de retraso, pero es que hasta ahora no he podido probar el código.<br><br>Más o menos funciona como quiero. La única diferencia entre mi caso real y el ejemplo propuesto es que en mi caso las clases (A1, A2, B1, B2...) están repartidas en distintos módulos. Y la clase Base también está en un módulo diferente. <br>
<br>Con una variación del ejemplo propuesto ya me he ahorrado el tener que hacer el check original<br><br> if hasattr(mod1, name):<br> return getattr(mod1, name)() <br><br>para cada una de las clases. Es todo un avance. Muchas gracias por la ayuda.<br>
<br>La única parte que aún tengo que hacer a mano es los imports de los módulos donde están las clases. Y añadir un import nuevo si en algún momento se crea un nuevo módulo. <br>Estoy jugando un poco con la combinación os.listdir() e __import__() como alguien recomendó en este mismo hilo. Aún no consigo que cuadre bien, se hace un lío con los directorios y tal, pero creo que antes o después encontraré la solución. <br>
<br>Muchas gracias por todo.<br><br>Saludos,<br>Jose<br><br><br><br><br><br><br>