<br><br><div class="gmail_quote">El 13 de octubre de 2010 07:42, Juan Ignacio <span dir="ltr">&lt;<a href="mailto:euribates@gmail.com">euribates@gmail.com</a>&gt;</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 &#39;Soy de la clase A1&#39;</div><div><br></div><div>class A2():</div><div>    __metaclass__ = Base</div><div>    def __str__(self): return &#39;Soy de la clase A2&#39;</div>


<div><br></div><div>class B1():</div><div>    __metaclass__ = Base</div><div>    def __str__(self): return &#39;Soy de la clase B1&#39;</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 &#39;Soy de la clase B2, value vale %s&#39; % self.value</div><div><div>-[ Cortar por aqui ]---------------------------------------</div>


<div></div></div><div><br></div><div>Por ejemplo:</div><div><br></div><div>&gt;&gt;&gt; a1 = instance_object_of_class(&#39;A1&#39;)</div><div>&gt;&gt;&gt; print a1</div><div>Soy de la clase A1</div><div><br></div><div>&gt;&gt;&gt; a2 = instance_object_of_class(&#39;A2&#39;)</div>


<div>&gt;&gt;&gt; print a2</div><div>Soy de la clase A2</div><div><br></div><div>&gt;&gt;&gt; b1 = instance_object_of_class(&#39;B1&#39;)</div><div>&gt;&gt;&gt; print b1</div><div>Soy de la clase B1</div><div><br></div><div>


&gt;&gt;&gt; b2 = instance_object_of_class(&#39;B2&#39;, 23)</div><div>&gt;&gt;&gt; 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 &quot;Base&quot; 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>