El 13/04/2011 20:35, "Arturo Muñoz T." escribió:
Tal vez no me expliqué bien, lo siento mucho y que eso les pudo haber
quitado mucho tiempo.
Mi idea es crear una clase MetaWord, la cual tiene informacion( de una
palabra en ingles) como:
significado, pronunciacion en mp3, ejemplos en contexto y demas.
Y esta clase Metaword quisiera que pudiera por ejemplo en algunos casos,
solo tener significado y
nada de mp3, significado y mp3 , ejemplos y mp3 y no significado.
Entonces se me ocurrio crear una clase MP3 para buscar su MP3 en
internet y guardarlo en una carpeta,
crear una clase Meaning para buscar el significado, y una clase Context
para buscar ejemplos.
Cada una de estas clases tiene diferentes argumentos para inicializarse,
y tienen sus correspondientes metodos
de busqueda.
Despues pense que seria buena idea juntar todo, pero aveces solo quiero
las caracteristicas de MP3 o solo las caracteristicas de Meaning.
Podria hacer esto con sentencias if en __init__ pero cada vez que le
quiera agregar una caracteristica de una nueva clase por ejemplo
ImagenDeLaPalabra
hay que modificar muchas cosas. Entonces usando una estructura if puedo
estar cambiando el comportamiento de __init__ pero
por ejemplo si quiero agregar ImagenDeLaPalabra al codigo que esta
abajo, hay que modificar muchas cosas. Entonces queria ver si habia
una manera mas limpia de hacer esto.
En resumen, en una clase meter todo lo de otras clases, decidir de que
clases quiero heredar y que no se sobreescriba
el método __init__ sino que simplemente se junten con super o con el
método que puse abajo. Tal vez no sea
tan trivial y evitarse el trabajo de estar modificando la clase no es
posible. Pero con metaclases puedo crear clases
dependiendo de mis necesidades pero ¿existe una mejor manera de hacer
esto? lo veo muy engorroso y dicen que
cuando no puedes explicarla implementacion de una forma sencilla tal vez
no es buena idea implementarla
> class metafile(Mp3, Meaning)
> def __init__(self,**kwargs): #pensaba en pasar algo asi (word =
> #'pepe', Mp3 = False , Meaning= True)
>
> if( kwargs.has_key('word'))
> self.word = word
> if( kwargs.has_key('directory'))
> self.directory = directory
> if(args['Mp3'] ):
> Mp3.__init__(self. self.word)
> if(args['Meaning']):
> Meaning.__init__(self. self.word, self.directory)
Si no te he entendido mal, para cada palabra le has de definir, de una
forma u otra las capacidades que tiene. Si es así esta es una de las
muchas posibilidades de hacerlo sin necesidad de metaclases:
# Una clase definiendo los atributos comunes a todas las capacidades
>>> class capacidad(object):
... Data = None
... # metodos comunes a todas las capacidades
... def GetData(self):
... return self.Data
...
# Capacidades
>>> class mp3(capacidad):
... def __init__(self, word):
... # Obtencion del mp3
... self.Data = "Soy el MP3 de %s" % word
...
>>> class meaning(capacidad):
... def __init__(self, word):
... # obtencion del meaning
... self.Data = "Soy el significado de %s" % word
...
# la clase word que maneja las capacidades de la palabra
>>> class word(object):
... def __init__(self, word, capacidades=()):
... self.Word = word
... self.Capacidades = {}
... for cap in capacidades:
... self.Capacidades[cap.__class__.__name__ ] = cap(self.Word)
...
... def GetCapList(self):
... # lista de capacidades soportadas
... return self.Capacidades.keys()
...
... def GetCap(self, cap):
... return self.Capacidades[cap].GetData()
...
# Declaras las paralabras incluyendole su lista de capacidades
>>> pal1 = word("mesa", (mp3, meaning))
>>> pal2 = word("silla", (mp3,))
>>> pal3 = word("taburete", (meaning,))
>>> pal4 = word("perigallo", ())
>>> pal1.GetCapList()
['meaning', 'mp3']
>>> pal2.GetCap("mp3")
'Soy el MP3 de silla'
>>> pal3.GetCap("meaning")
'Soy el significado de taburete'
>>> pal4.GetCap("meaning")
Traceback (most recent call last):
File "<input>", line 1, in <module>
File "<input>", line 14, in GetCap
ValueError: perigallo no tiene capacidad de meaning
>>>
De esta forma agregar una nueva capacidad es simplemente crear su clase
y agregarla en la declaración de las palabras que la utilicen.
Si implementas __getattr__ en la clase word tambien podras utilizar las
capacidades como propiedades: pal1.mp3, ...
Saludos,
--
Oswaldo Hernández
_______________________________________________
Python-es mailing list
Python-es@python.org
http://mail.python.org/mailman/listinfo/python-es
FAQ: http://python-es-faq.wikidot.com/