busqueda por cualquier atributo

Juan Ignacio Rodríguez de León jileon en parcan.es
Mie Feb 16 11:52:22 CET 2005


chaoslord (by way of Manuel <frame_256 en yahoo.com.ar>) wrote:
> 
> Supongamos una clase Cliente. Me gustaría saber cuál es la mejor forma de 
> realizar búsquedas por __cualquier__ atributo de la clase. La idea es que se 
> pueden especificar diferenes atributos a cada cliente, además de su numbre y 
> apellido.
> El código de abajo es un ejemplo de lo que intento. Un problema con éste es 
> que no tengo forma de controlar los atributos que se pasan. El nombre, el 
> apellido y el ID deberían ser obligatorios.
> 

No se si es que no he entendido el problema, pero ¿No valdría esto?

--------------------------------------------------------------------

class Cliente:
     def __init__(self, identificador, nombre, apellidos, **atrs):
         self.identificador = identificador
         self.nombre = nombre
         self.apellidos = apellidos
         for (nombre, valor) in atrs.items():
             setattr(self, nombre, valor)

     def comparar(self, **atrs):
         "retorna True si el cliente cumple con los requisitos args"
         for (campo, valor) in atrs.items():
             if str(valor) not in str(getattr(self, campo)):
                 return False
         return True

CLIS=[]
CLIS.append(Cliente('C01', 'Marta', 'Perez', dni=2212))
CLIS.append(Cliente('C02', 'Juan', 'Perez', dni=3030, tel=0610))
CLIS.append(Cliente('C03', 'Juana', 'Gomez', dni=1221, desc='tururu'))
CLIS.append(Cliente('C04', 'Perico', 'Jumilla', dni=32241, edad=23))

for C in CLIS:
     print C.nombre, C.apellidos, C.identificador, C.dni
     print "- Buscar 'Juan' en el nombre:",
     print C.comparar(nombre='Juan')
     print "- Buscar 'Perez' en el apellido:",
     print C.comparar(apellidos='Perez')
     print "- Buscar '22' en el DNI y 'J' en el apellido:",
     print C.comparar(dni=22, apellidos='J')
     print

------------------------------------------------------------------
De esta forma "obligas" a definir los atributos obligatorios, y permites
añadir atributos particulares, pudiendo buscar por todos. El propio
interprete te avisará si omites alguno de los parámetros obligatorios.




Más información sobre la lista de distribución Python-es