IIC2233 / Syllabus-2022-1

Repositorio oficial del curso IIC2233 Programación Avanzada 🚀✨
https://iic2233.ing.puc.cl/
45 stars 40 forks source link

Duda sobre cómo poder crear distintos selfs #207

Closed IgnacioHqz closed 2 years ago

IgnacioHqz commented 2 years ago

Prerrequisitos

(Marcar colocando una X entre los corchetes los ítems que ya hiciste, así: "[X]")

Duda

Hola!, quisiera saber si existe alguna forma de ir creando selfs dentro de un while. Quisiera poder crear selfs dentro de un while utilizando el contador como el identificador del self, por ejemplo, self."algo_1" pero que ese 1 vaya cambiando y tome el valor del contador que utiliza el while. Lo intenté hacer pero cuando trato de utilizar esos selfs dicen que no existen, por lo que asumo que la forma en que lo estoy haciendo no está bien. No sé si las dudas que se preguntan en las issues tienen que ser sólo conceptuales y no de cómo escribir algo en código, pero de todas formas quise preguntar. Muchas gracias! [De ser necesario, coloca tu pregunta de manera explícita utilizando este formato]

JJJGGGG commented 2 years ago

Hola @IgnacioHqz . Lo que indicas es posible, pero no es recomendado. Te voy a enseñar cómo lo puedes hacer, pero NO puedes usar esto si no lo entiendes bien. Te daré una alternativa, no te preocupes.

Para realizar eso, tienes que modificar self.__dict__ en tu objeto. esa variable contiene un diccionario en el formato llave: valor donde la llave es el nombre del atributo (que no se llama "un self", es un atributo) y valor es su valor. Una forma sería

class A:
    def metodo(self):
        for i in range(10):
            self.__dict__["variable" + str(i)] = 10

a = A()
a.metodo()
print(a.variable1)

Ahora, si bien esto es posible, no es algo correcto. Principalmente porque no sabes cuantas variables habrán dentro con ese nombre, por lo que hacer a.variable10 puede funcionar o fallar dependiendo de cuantas iteraciones hayas hecho, de cuando las hayas guardado, etc. Entonces lo que estarías haciendo es buscar la variable misma en self.__dict__, de una forma parecida a a.__dict__["variable" + str(a.numero_maximo)], pero si vas a estar haciendo esas cosas mejor creas un diccionario.

Entonces, la alternativa que SI puedes / deberías usar en ese caso es crear un atributo que sea un diccionario. Luego haces lo mismo, pero con el diccionario en vez de guardarlo directamente en el objeto. Esta forma sería así


class A:
    def __init__(self):
        self.variables = {}
    def metodo(self):
        for i in range(10):
            self.variables["variable" + str(i)] = 10

a = A()
a.metodo()
print(a.variables["variable1"])

Ojalá te sirva!