__init __ (self) -> None: vs __init __ (self): in python [duplicate]

Sep 25 2020

¿Cuál es la diferencia entre 1) __init__(self) -> None:y 2) __init__(self):?

class A:
    def __init__(self) -> None:
        self.a = 5

class B:
    def __init__(self):
        self.a = 5

print (" A : ", A().a)
print (" B : ", B().a)

Respuestas

radzak Sep 25 2020 at 21:57

La -> Noneparte es una sugerencia de tipo. Se introdujo en PEP 484. Puede leer más sobre él aquí . Ambos __init__métodos que mostró son equivalentes en el tiempo de ejecución. Las sugerencias de tipo pueden ser utilizadas por verificadores de tipo, como mypy o Pyright .

Esta pieza de mypydocumentación lo resume a la perfección:

Como mypy es un analizador estático, o una herramienta similar a la pelusa, las anotaciones de tipo son solo sugerencias para mypy y no interfieren al ejecutar su programa. Ejecuta su programa con un intérprete estándar de Python y las anotaciones se tratan de manera efectiva como comentarios.

Esta es también una pieza interesante del PEP 484 que explica la razón -> Nonede ser del __init__método.

(Tenga en cuenta que el tipo de retorno de init debe anotarse con -> None. La razón de esto es sutil. Si init asumiera una anotación de retorno de -> None, eso significaría que un método init sin argumentos y sin anotaciones debería En lugar de dejar esto ambiguo o introducir una excepción a la excepción, simplemente decimos que init debe tener una anotación de retorno; el comportamiento predeterminado es, por lo tanto, el mismo que para otros métodos).