[Python-es] búsqueda automática de clases en un paquete
Juan Ignacio
euribates en gmail.com
Mie Oct 13 13:42:04 CEST 2010
>
> ¿tendría que mantener a mano ese diccionario o hay forma de hacer que se
> cree automáticamente?
>
> 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í::
-[ Cortar por aqui ]---------------------------------------
class Base(type):
Catalogo = {}
def __new__(cls, name, bases, dct):
new_class = type.__new__(cls, name, bases, dct)
Base.Catalogo[name] = new_class
return new_class
def instance_object_of_class(class_name, *args):
return Base.Catalogo[class_name](*args)
class A1():
__metaclass__ = Base
def __str__(self): return 'Soy de la clase A1'
class A2():
__metaclass__ = Base
def __str__(self): return 'Soy de la clase A2'
class B1():
__metaclass__ = Base
def __str__(self): return 'Soy de la clase B1'
class B2():
__metaclass__ = Base
def __init__(self, value):
self.value = value
def __str__(self): return 'Soy de la clase B2, value vale %s' %
self.value
-[ Cortar por aqui ]---------------------------------------
Por ejemplo:
>>> a1 = instance_object_of_class('A1')
>>> print a1
Soy de la clase A1
>>> a2 = instance_object_of_class('A2')
>>> print a2
Soy de la clase A2
>>> b1 = instance_object_of_class('B1')
>>> print b1
Soy de la clase B1
>>> b2 = instance_object_of_class('B2', 23)
>>> print b2
Soy de la clase B2, value vale 23
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
por si se intentar definir dos clases con el mismo nombre, ahora mismo la
mas nueva machacaría a la
mas antigua.
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://mail.python.org/pipermail/python-es/attachments/20101013/34512468/attachment.html>
Más información sobre la lista de distribución Python-es