es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

La escritura en Python permite objetos de una determinada clase en el __init__ de esa misma clase.

Estoy tratando de crear una clase llamada Theme cuya función __init__ permite que se pase otro objeto, que puede ser de tipo Theme. Pero cuando intento indicar con un tipo de dato que se permite un objeto de ese tipo, Python arroja un error porque Theme aún no está definido. Aquí está el código, que funciona cuando quito la indicación de tipo:

from typing import Union

class Theme:

    def __init__(self, start: Union[dict, Theme, None] = None):
        if start is None:
            start = {}
        elif isinstance(start, Theme):
            start = start.dict
        self.dict = start

El error que estoy obteniendo es:

Traceback (most recent call last):
  File "C:/Users/.../Test.py", line 4, in <module>
    class Theme:
  File "C:/Users/.../Test.py", line 6, in Theme
    def init(self, start: Union[dict, Theme, None] = None):
NameError: name 'Theme' is not defined

¿Hay alguna manera en que pueda lograr esto o simplemente no es posible y no debería molestarme?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Puedes lograr esto utilizando una cadena como marcador de posición para la clase Theme en la pista de tipo. Así es cómo puedes modificar tu código para que funcione:

    from typing import Union
    
    
    class Theme:
    
        def __init__(self, start: Union[dict, 'Theme', None] = None):
            if start is None:
                start = {}
            elif isinstance(start, Theme):
                start = start.dict
            self.dict = start
    

    Al utilizar 'Theme' en lugar de Theme en la pista de tipo, le estás indicando a Python que considere Theme como una cadena en lugar de una clase en este punto. Esto te permite utilizar la clase Theme en la pista de tipo sin definirla primero.

    Esta técnica se llama “referencia anticipada”. Es una forma de hacer referencia a una clase que aún no ha sido definida, pero lo será más adelante en el código. Ten en cuenta que la referencia anticipada solo funciona para clases, no para variables o funciones.

    En resumen, puedes lograr tu objetivo de permitir que se pasen objetos de tipo Theme a la función __init__ utilizando una cadena como marcador de posición para la clase Theme en la pista de tipo.

Comments are closed.