IIC2233-2016-1 / syllabus

Página principal del curso
32 stars 34 forks source link

[Tarea 1][Instanciación dentro de un for] #32

Closed micostabal closed 8 years ago

micostabal commented 8 years ago

Hola! ¿Cómo podría hacer para instanciar dentro de una sentencia "for" de forma que cada instancia tenga un nombre dado por otra lista de nombres? Algo así:

lista = [nombre1, nombre2, ..., nombre n]
for k in lista:
   i = Clase(...)

En stack aparece cómo hacerlo, pero sin nombres, muchas gracias

aaossa commented 8 years ago

Hola, ¿qué es exactamente lo que quieres hacer? Por favor reformula tu pregunta porque no entendimos bien tu ejemplo :disappointed: Trata de usar un ejemplo chico mas explicativo.

Pero... me la jugaré por una respuesta. Asumiendo que lo que quieres es "usar los valores en la lista lista como nombre de variables para los elementos creados en el loop de la clase Clase" te recomiendo usar un diccionario (dict(), aparecen en el material del curso). De esta forma puedes acceder a los objetos así:

lista = [nombre1, nombre2, ..., nombreN]
diccionario = dict() # O {}
for k in lista:
    diccionario[k] = Clase(...)

print(diccionario["nombre1"])

EDIT: Creo que esto es... Si lo que quieres es que "reemplazar" el elemento en la lista con el objeto de la clase Clase que crees, lo mejor que puedes hacer por ahora es crear una nueva lista y añadirle el nuevo objeto. Así funcionan los for loops en Python. Para más detalles sobre Python con esto debería bastar...

micostabal commented 8 years ago

Una pregunta que también resuelve la duda es ¿cómo puedo instanciar una clase, si tengo el nombre de la instancia solamente en formato string? Ya que si hago una lista con todos estos elementos después puede ser muy engorroso/comlpejo buscar estas instancias de manera fácil.

agmardones commented 8 years ago
class Clase:
    pass
a = "Clase"
print(eval(a)())

algo así? edit: no sé como poner códigos :dancers: , pero quería mostrar el eval()

aaossa commented 8 years ago

NO HAGAS ESO. Usar eval es una mala práctica.

Python tiene mejores formas de hacer esto. Siguiendo lo que respondiste ahora usa un diccionario.

PD: No usen eval, cada vez que lo usan no muere un gatito, sino dos :(

mjjunemann commented 8 years ago

Una de las soluciones que se puede hacer si tienes el nombre de la la clase es aprovecharte que todo en python es un objeto:

class Dog():
      def __init__(self,name):
            self.name = name

clases = {}
clases['dog'] = Dog

instancia1 = clases['dog']('Martin') 
instancia2 = clases['dog']('Antonio')

Donde como la clase Dog de por si también es un objeto, luego puedes hacer una llamada a este, logrando el call del constructor, donde la instancia1 y la instancia2 son dos objetos totalmente distintos

Luego puedes tener un diccionario de la forma

clases = {
'clase1': clase1,
'clase2': clase2,
'clase3': clase3
}

\ Edit: No estoy seguro si puede servirte para que entiendas este concepto, que busques funciones lambda en python

sumar = lambda x,y: x+y 
sumar(2,3)
sumar(4,5) 
agmardones commented 8 years ago

Buena, no sabía que se podía hacer eso, gracias!

y sorry por proponer el malévolo eval :(