2010-07-08 4 views
7

Sono nuovo di Python e mentre l'unità testava alcuni metodi sul mio oggetto ho notato qualcosa di "strano".Python: la chiamata di un metodo 'direttamente' istanzia l'oggetto?

class Ape(object): 
    def __init__(self): 
     print 'ooook' 

    def say(self, s): 
     print s 

def main(): 
    Ape().say('eeek') 

if __name__ == '__main__': 
    main() 

Ho scritto questo piccolo esempio per illustrare dove mi sono confuso. Se fai Ape(). Say ('eeek') questo crea un'istanza di un oggetto Ape ed esegue il metodo init? Pensavo che non sarebbe successo, ma ho avuto alcuni strani effetti collaterali quindi ora penso che sia così?

risposta

10

Sì, sì. Questo è ciò che fa Ape(): crea un nuovo oggetto Ape e come parte di quel processo viene eseguito il metodo __init__.

Nell'esempio, si chiama il metodo say di tale oggetto. Si noti che non sarebbe possibile chiamare say se non si dispone di un oggetto Ape.

+0

Grazie che cancella le cose. Immagino che Ape() si accaparrà il raccolto subito visto che non vi è alcun riferimento ad esso da nessuna parte? – Pickels

+1

@Pickels: diventa inaccessibile subito, quindi _could_ essere immondizia raccolta immediatamente, sì. Oppure potrebbe restare nel nether vuoto della memoria irraggiungibile fino a quando l'interprete Python decide di voler recuperare lo spazio ;-) –

3

Sì. Ape() crea un'istanza di un oggetto Ape di classe, sebbene non ci sia assegnamento, nessuna etichetta è associata ad esso. A questo punto viene chiamata la sua funzione __init__. Quindi, viene chiamata la funzione di dire.

essere chiaro:

Ape().say('eeek') 

è equivalente a:

(Ape()).say('eeek') 

che indica più chiaramente cosa accade prima.

12

Se si desidera chiamare un metodo direttamente senza creare un'istanza è possibile utilizzare il staticmethod decoratore. Si noti che non v'è alcun self quando si utilizza un metodo statico

class Ape(object): 
    def __init__(self): 
     print 'ooook' 

    @staticmethod 
    def say(s): 
     print s 

def main(): 
    Ape.say('eeek') 

if __name__ == '__main__': 
    main() 

Confronta con metodi di classe in cui la classe è il primo parametro, invece di un'istanza

class Ape(object): 
    def __init__(self): 
     print 'ooook' 

    @classmethod 
    def say(cls, s): 
     print "the class is:", cls 
     print s 

def main(): 
    Ape.say('eeek') 

if __name__ == '__main__': 
    main() 
+0

Grazie, apprezzo molto le informazioni extra che hai fornito. – Pickels

+0

La parte di informazioni sulla classe è stata estremamente utile grazie. Una cosa da notare però è che il metodo init non viene eseguito in entrambi perché non è istanziato. – ThinkBonobo

Problemi correlati