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