__init __ (self) -> Nessuno: vs __init __ (self): in python [duplicate]
Qual è la differenza tra 1) __init__(self) -> None:e 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)
Risposte
La -> Noneparte è un suggerimento sul tipo. È stato introdotto in PEP 484. Puoi saperne di più qui . Entrambi i __init__metodi che hai mostrato sono equivalenti nel runtime. I suggerimenti sul tipo possono essere utilizzati dai controlli del tipo, come mypy o Pyright .
Questo pezzo di mypydocumentazione lo riassume perfettamente:
Poiché mypy è un analizzatore statico o uno strumento simile a lanugine, le annotazioni di tipo sono solo suggerimenti per mypy e non interferiscono durante l'esecuzione del programma. Esegui il tuo programma con un interprete Python standard e le annotazioni vengono trattate efficacemente come commenti.
Questo è anche un pezzo interessante del PEP 484 che spiega la logica alla base dell'inserimento -> Nonedel __init__metodo.
(Nota che il tipo restituito di init dovrebbe essere annotato con -> Nessuno. La ragione di ciò è sottile. Se init assumesse un'annotazione di ritorno di -> Nessuno, significherebbe che un metodo init senza argomenti e non annotato dovrebbe essere ancora controllato dal tipo? Invece di lasciare questo ambiguo o introdurre un'eccezione all'eccezione, diciamo semplicemente che init dovrebbe avere un'annotazione di ritorno; il comportamento predefinito è quindi lo stesso degli altri metodi.)