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à.