[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