2012-10-14 2 views
12

Eventuali duplicati:
Why do you need explicitly have the “self” argument into a Python method?Perché sempre aggiungere l'auto come primo argomento ai metodi di classe?

capisco perché io è sempre il primo argomento per metodi di classe, questo ha un senso totale, ma se è sempre il caso, allora perché andare attraverso il fastidio di digitare se per ogni definizione di metodo? Perché non farlo qualcosa che viene automaticamente fatto dietro le quinte?

E 'per chiarezza o c'è una situazione in cui non si può passare a se stessi come primo argomento?

+6

Si noti che il termine * metodo di classe * indica qualcosa di diverso rispetto a ciò che si pensa che significhi. Un * metodo * è una funzione di proprietà di una classe, che agisce su un'istanza: un * metodo di classe * è un metodo che è di proprietà di una classe, che agisce sulla classe. Parli del primo (che prende per convenzione '' self'') in opposizione a quest'ultimo (che per convenzione prende '' cls''). –

+0

super utile risponde a tutti, grazie! –

risposta

21

Perché l'esplicito è meglio che implicito. Rendendo il parametro un requisito esplicito, si semplificano la comprensione del codice, l'introspezione e la manipolazione. È ulteriormente ampliato nel Python FAQ.

Inoltre, è possibile definire i metodi della classe (prendere una classe, invece di un'istanza come primo argomento), ed è possibile definire metodi statici (non prendono una 'prima' argomento affatto):

class Foo(object): 
    def aninstancemethod(self): 
     pass 

    @classmethod 
    def aclassmethod(cls): 
     pass 

    @staticmethod 
    def astaticmethod(): 
     pass 
+8

Direi * Perché l'esplicito è meglio di implicito * è una semplificazione eccessiva. –

+1

@Lattyware: avrei dovuto forse spiegare di più, ma * Explicit è meglio di implicito * ** è ** al centro della filosofia di Python. –

+0

Molto, ed è un punto importante qui, vorrei solo dire che ci sono molti altri (e più importanti) motivi per cui questo è il modo in cui Python funziona. –

12

Guido ha spiegato che here. Fondamentalmente, i metodi sono funzioni e le funzioni non devono accettare parametri "nascosti", altrimenti le strutture di ordine superiore, come i decoratori, non saranno in grado di gestirle in modo ragionevole.