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

Sep 25 2020

Jaka jest różnica między 1) __init__(self) -> None:a 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)

Odpowiedzi

radzak Sep 25 2020 at 21:57

-> NoneCzęść stanowi wskazówkę typu. Został wprowadzony w PEP 484. Możesz przeczytać o tym więcej tutaj . Obie __init__metody, które pokazałeś, są równoważne w środowisku wykonawczym. Podpowiedzi do typów mogą być używane przez narzędzia do sprawdzania typów, takie jak mypy lub Pyright .

Ta mypydokumentacja podsumowuje to doskonale:

Ponieważ mypy jest statycznym analizatorem lub narzędziem podobnym do kłaczków, adnotacje typu są tylko wskazówkami dla mypy i nie przeszkadzają podczas uruchamiania programu. Uruchamiasz program za pomocą standardowego interpretera języka Python, a adnotacje są skutecznie traktowane jako komentarze.

Jest to również interesujący fragment PEP 484, który wyjaśnia uzasadnienie wprowadzenia -> Nonetej __init__metody.

(Zwróć uwagę, że zwracany typ init powinien być opatrzony adnotacją -> Brak. Przyczyna tego jest subtelna. Jeśli init założyłby adnotację zwrotną -> Brak, oznaczałoby to, że metoda init bez argumentów i bez adnotacji powinna nadal być sprawdzanym typem? Zamiast pozostawiać to niejednoznaczne lub wprowadzać wyjątek od wyjątku, po prostu mówimy, że init powinien mieć adnotację powrotu; domyślne zachowanie jest więc takie samo, jak w przypadku innych metod).