1) Perché è richiesto self come parametro esplicito nelle firme dei metodi?
Poiché i metodi sono funzioni e foo.bar(baz) è solo zucchero sintattico per bar(foo, baz) . Le classi sono solo dizionari in cui alcuni dei valori sono funzioni. (I costruttori sono anche solo funzioni, ed è per questo che Python non ha bisogno di new ). Si può dire che Python rende esplicito che gli oggetti sono costruiti con componenti più semplici. Questo è in accordo con la filosofia "esplicita è meglio che implicita".
Al contrario, negli oggetti Java sono davvero magici e non possono essere ridotti a componenti più semplici nella lingua. In Java (almeno fino a Java 8) una funzione è sempre un metodo di proprietà di un oggetto e questa proprietà non può essere modificata a causa della natura statica della lingua. Pertanto non vi è alcuna ambiguità su cosa si riferisca a this , quindi ha senso averlo implicitamente definito.
JavaScript è un esempio di un linguaggio che ha un% implicito come% di Java, ma in cui le funzioni possono esistere separatamente da oggetti come in Python. Questo porta a un sacco di confusione su cosa this fa riferimento quando le funzioni vengono passate e chiamate in diversi contesti. Molti pensano istintivamente che this debba riferirsi a qualche proprietà intrinseca della funzione, mentre in realtà è determinata esclusivamente dal modo in cui viene chiamata la funzione. Credo che avere this come parametro esplicito come in Python renderebbe molto meno confuso.
Alcuni altri vantaggi del parametro this -parametro esplicito:
-
I decoratori sono solo funzioni che racchiudono altre funzioni. Poiché i metodi sono solo funzioni, i decoratori funzionano altrettanto bene sui metodi. Se ci fosse un qualche tipo di sé implicito, i decoratori non lavorerebbero in modo trasparente sui metodi.
-
I metodi di classe e i metodi statici non accettano un parametro di istanza. Classmethods accetta una classe come primo argomento (in genere chiamato self ). I parametri espliciti cls o self rendono molto più chiaro cosa sta succedendo e a cosa hai accesso nel metodo.
2) Perché le variabili istanze devono sempre essere qualificate con " cls ?
In Java, non è necessario prefisso le variabili membro con " self. ", ma in Python " this. " è sempre richiesto. La ragione è che Python non ha una sintassi esplicita per dichiarare le variabili, quindi non ci sarebbe modo di dire se self. dovrebbe dichiarare una nuova variabile locale o assegnarla a una variabile membro. Specificando x = 7 risolvi questa ambiguità.