2011-10-11 9 views
17

Si suppone di utilizzare self quando si fa riferimento a una funzione membro in Python (all'interno dello stesso modulo)?Quando usi 'self' in Python?

Più in generale, mi chiedevo quando è necessario utilizzare self, non solo per i metodi ma anche per le variabili.

risposta

20

Aggiunta di una risposta perché Oskarbi di non è esplicito.

si utilizza self quando:

  1. Definizione di un metodo di istanza. Viene passato automaticamente come primo parametro quando si chiama un metodo su un'istanza ed è l'istanza in cui è stato chiamato il metodo.
  2. Riferimento a un attributo di classe o istanza all'interno di un metodo di istanza. Usalo per chiamare un metodo o accedere a un nome (variabile) nell'istanza in cui è stato chiamato il metodo, all'interno di quel metodo.

È non lo fanno uso self quando

  1. si chiama un metodo di istanza normalmente. Usando l'esempio di Oskarbi, se si fa instance = MyClass(), si chiama MyClass.my_method come instance.my_method(some_var) non come instance.my_method(self, some_var).
  2. Si fa riferimento a un attributo di classe da all'esterno di un metodo di istanza ma all'interno della definizione di classe.
  3. Sei all'interno di un staticmethod.

Queste cose da non fare sono solo esempi di quando non usare il sé. I dos sono quando si utilizza .

1

Ad esempio variabile e per i metodi è obbligatorio utilizzare self in qualsiasi momento.

+0

Così, in caso di dubbio, sempre andare con esso? –

+0

Sì! È obbligatorio – lc2817

+0

@DarkTemplar Si usa sempre self quando si definisce _defining_ un metodo di istanza o si chiama uno o si fa riferimento a una variabile di istanza all'interno di un metodo di istanza, non altrimenti. Non so cosa intendesse con "anytime" ma non è vero come preso alla lettera. – agf

11

Utilizzare self per fare riferimento a variabili di istanza e metodi da altri metodi di istanza. Inserire anche self come primo parametro nella definizione dei metodi di istanza.

Un esempio:

class MyClass(object): 

    my_var = None 

    def my_method(self, my_var): 
     self.my_var = my_var 
     self.my_other_method() 

    def my_other_method(self): 
     # do something... 
+0

Quindi "classe MyClass (oggetto)" è un costruttore? Vedo che 'oggetto' è un parametro ma non sono sicuro di cosa significhi ... –

+0

@DarkTemplar I parametri in una definizione di classe sono classi base (c'è anche un parametro keyword, 'metaclass' per impostare il tipo della classe in Python 3) – agf

+0

Questo non è un costruttore, ma la definizione della classe. Come dice @agf, 'object' è solo la classe base. Quando istanziate la classe non dovete passare alcun parametro (eccetto se avete specificato un metodo '__init __ (self)' con più parametri). – Oskarbi

3
  1. Non c'è niente di 'speciale' circa il nome self. È il nome preferito per convenzione da Pythonistas, per indicare cosa ci si aspetta che quel parametro contenga.

  2. Il runtime di Python passerà un valore di "sé" quando si chiama un metodo di istanza su un'istanza, indipendentemente dal fatto che lo si fornisca deliberatamente oppure no. Ciò di solito si traduce in un errore facilmente diagnosticato/inteso (poiché la funzione verrà chiamata con il numero sbagliato di parametri), ma l'uso di *args può portare a errori di tipo piuttosto più strani.

  3. Il parametro viene passato implicitamente quando si chiama un metodo di istanza su un'istanza. Contiene l'istanza su cui si chiama il metodo.Quindi non si menziona self nella chiamata di funzione perché (a) come notato sopra, ciò non avrebbe alcun senso (non c'è un self in ambito, in generale, e self non è una parola chiave o un nome speciale o qualcosa); (b) hai già indicato l'istanza da utilizzare (scrivendo my_instance.).

  4. È possibile, ovviamente, chiamare esplicitamente un metodo di istanza accedendo dalla classe. In questo caso, dovrai passare esplicitamente l'istanza come primo parametro. In generale, non vuoi farlo. E tu in particolare non vuoi scrivere codice che consideri la possibilità che il primo parametro sia qualcos'altro che è stato esplicitamente passato in questo modo. Questo è simile al controllo di if (this == null) in C++: non lo fai, perché se può eventualmente significare qualcosa, quindi il codice chiamante è sbagliato, moralmente se non legalmente. (Almeno in Python non avrai problemi con un comportamento indefinito, ma è ancora moralmente sbagliato.)

  5. All'interno del metodo di istanza, poiché self è un parametro a cui è stata assegnata l'istanza come valore, è possibile scrivere self.whatever per accedere agli attributi dell'istanza. A differenza di altri linguaggi di stile "implicito this", i nomi degli attributi sono non implicitamente "nell'ambito".

  6. Non ci sono altri casi d'uso per self, poiché ancora una volta non è un nome speciale, e questo è l'unico scopo specifico che la convenzione di denominazione indirizza. Se dovessi accedere a una 'variabile' (in realtà un attributo) da un altro modulo, dovresti usare il nome del modulo. Se si desidera accedere a uno dal modulo corrente, non è necessario alcun prefisso, o realmente possibile per quella materia. (Beh, si potrebbe esplicitamente cercarlo nel dict restituito da globals(), ma per favore non farlo.)

Problemi correlati