2009-07-03 14 views
38

Python è la lingua che conosco di più, e stranamente ancora non so perché sto scrivendo "self" e non "this" come in Java o PHP.Perché Pythonistas chiama il riferimento attuale "self" e non "this"?

So che Python è più vecchio di Java, ma non riesco a capire da dove viene. Soprattutto dal momento che è possibile utilizzare qualsiasi nome anziché "self": il programma funzionerà correttamente.

Da dove viene questa convenzione?

+5

È possibile utilizzare "questo" anziché "sé" quanto si desidera. Tuttavia, ciò potrebbe confondere alcuni evidenziatori di sintassi e strumenti di ispezione del codice. Usare "sé" è solo una convenzione. – balpha

+0

"self" e "this" hanno entrambe quattro lettere, quindi nessuno sembra essere migliore dell'altro. – Jonathan

+0

Ho appena scritto che è una convenzione. –

risposta

63

Smalltalk-80, rilasciato da Xerox nel 1980, utilizzato self. I layer Objective-C (primi anni '80) Smalltalk funzionano su C, quindi usa anche self. Anche Modula-3 (1988), Python (fine anni '80) e Ruby (metà anni '90) seguono questa tradizione.

C++, anch'esso risalente ai primi anni '80, ha scelto this anziché self. Poiché Java è stato progettato per essere familiare agli sviluppatori C/C++, utilizza anche this.

Smalltalk utilizza la metafora degli oggetti che inviano messaggi l'un l'altro, quindi "self" indica semplicemente che l'oggetto sta inviando un messaggio a se stesso.

+10

Object Pascal (sia i primi gusti di Apple che quelli successivi di Borland, incluso Delphi) sono andati anche con "self". –

+7

Smalltalk e Objective-C utilizzano entrambi la metafora degli oggetti che inviano messaggi tra loro, quindi "self" indica semplicemente che l'oggetto sta inviando un messaggio a se stesso. (Mi è sempre sembrato più naturale usare "self" invece di "this".) –

+3

Per non dimenticare self, la lingua :) – akuhn

19

Smalltalk, che precede naturalmente Java.

+1

Grazie pallido, dormirò meglio stasera. –

+0

Non sono sicuro del motivo per cui questa risposta ha 18 voti positivi. Qualche ragione particolare? Mi sto perdendo qualcosa qui? – Nabin

28

Controllare la history of Python per le classi definite dall'utente:

Invece, si definisce semplicemente una funzione il cui primo argomento corrisponde al caso, che per convenzione è denominato "self". Per esempio:

def spam(self,y): 
    print self.x, y 

Questo approccio assomiglia qualcosa che avevo visto in Modula-3, che aveva già mi ha fornito la sintassi per l'importazione e la gestione delle eccezioni.

È una scelta valida come tutte le altre. Potresti chiedere perché C++, Java e C# hanno scelto "questo" altrettanto facilmente.

+2

Scusa amico, ma in realtà stai solo ripetendo ciò che ho detto nella domanda: python usa se stesso, è una convenzione. La domanda è perché. –

+6

Le virgolette e il link spiegano il creatore della motivazione di Python. Sarebbe difficile ottenere un "perché" migliore di quello. Duffymo non sta ripetendo la tua domanda - Guido lo è. –

+5

"... qualcosa che avevo visto in Modula-3 ..." - ha più documentazione di "Smalltalk perché l'ho detto". Credo che l '"io" nella storia sia BDFL Guido. – duffymo

5

Penso che dal momento che è dichiarato esplicitamente ha più senso vedere un argomento effettivo chiamato "sé" piuttosto che "questo". Dal punto di vista grammaticale, il "sé" non è dipendente dal contesto come "questo".

Non so se mi sono reso abbastanza chiaro, ma comunque questo è solo un apprezzamento soggettivo.

7

L'ispirazione primaria era Modula-3, che Guido è stato introdotto per il Dec:

la relazione finale Modula-3 stava comportando scritto lì a circa lo stesso tempo. Ciò che ho appreso è apparso in Gestione delle eccezioni Python, moduli, e il fatto che i metodi esplicitamente contengono "self" nell'elenco dei loro parametri .

- Guido, Linux Journal Interviews Guido van Rossum

15

Rispetto al pitone, non c'è niente di speciale self. È possibile utilizzare this, invece, se si voleva:

Ecco un esempio:

>>> class A(object): 
... def __init__(this): 
...  this.x = 3 
... 
>>> a = A() 
>>> a.x 
3 

Anche se si potrebbe chiamare come volete, self è la convenzione per il primo argomento di una funzione di classe. Controlla paragraph 5 of section 9.4 nella documentazione python, che dice:

Spesso, il primo argomento di un metodo è chiamato self. Questo non è nulla di più di una convenzione: il nome self non ha assolutamente alcuno speciale significato per Python. Si noti, tuttavia, che non seguendo la convenzione il proprio codice potrebbe essere meno leggibile ad altri programmatori Python, ed è anche concepibile che un programma di classe browser possa essere scritto che si basa su tale convenzione.

Come per la convenzione, è iniziato in Smalltalk, ma è anche utilizzato in Object Pascal, Python, Ruby e Objective-C. This answer ha un'ottima spiegazione.

+7

Questa non era la domanda. –

+0

Grazie a @terrace, non ero a conoscenza che potrei usare 'this' in python anche. Anche la tua descrizione è ragionevole. –

+1

Unisci questa risposta alla domanda precedente, in gran parte identica: potresti volergli dare una rapida risposta. – Shog9

8

Python segue le orme di Smalltalk nell'aspetto: l'auto è utilizzato anche in Smalltalk. Credo che la vera domanda dovrebbe essere 'perché Bjarne decide di utilizzare this in C++' ...

+1

Questa ... è la risposta. – manojlds

+0

Unisci questa risposta alla domanda precedente, in gran parte identica: potresti volergli dare una rapida occhiata. – Shog9

2

self non è una parola chiave (*).

self rappresenta per convenzione l'indirizzo dell'oggetto corrente

È possibile ottenere ulteriori informazioni selfhere.

Perché non this? bene è una convenzione per un nome. Puoi usare this per il tuo codice se ti piace di più.


(*) Questa risposta è stata portata e unite qui da una domanda che chiede why 'self' instead of 'this' keyword. Poiché il chiarimento in questa prima riga potrebbe essere utile per gli altri, lo tengo qui.

+0

Unisci questa risposta alla domanda precedente, in gran parte identica: potresti volergli dare una rapida occhiata. – Shog9

Problemi correlati