2012-08-13 10 views
6

Se ho una classe con diverse funzioni:Python: funzioni in una classe e di memoria

class Example: 

    def func1(self): 
     print 'Hi1' 
    def func2(self): 
     print 'Hi2' 
    def func3(self): 
     print 'Hi3' 

Se creo diversi casi di 'Esempio', fa ogni negozio esempio le proprie copie delle funzioni nella classe ? Oppure Python ha un modo intelligente per archiviare la definizione solo una volta e cercarla ogni volta che un'istanza usa una funzione nella classe?

Inoltre, che dire delle funzioni statiche? La classe conserva solo una copia di ciascuna funzione statica?

+0

Non sono sicuro di capire la differenza di prestazioni che questo implicherebbe. – rsegal

+0

Im istanziare milioni di istanze di una classe, quindi ho bisogno di capire come la memoria sarà interessata. –

risposta

12

Durante l'istanziazione di una classe, non vengono creati nuovi oggetti funzione, né per i metodi di esempio né per i metodi statici. Quando si accede a un metodo di istanza tramite obj.func1, viene creato un nuovo oggetto wrapper denominato "metodo associato", che verrà conservato solo per il tempo necessario. L'oggetto wrapper è ligh-weight e contiene fondamentalmente un puntatore all'oggetto funzionale sottostante e all'istanza (che viene passato come parametro self quando viene chiamata la funzione).

Si noti che l'utilizzo di staticmethod è quasi sempre un errore in Python. Deve la sua esistenza a un errore storico. Di solito vuoi una funzione a livello di modulo se pensi di aver bisogno di un metodo statico.

+0

Bene e comprensibile - buona nota anche su staticmethod –

+0

Nota anche che gli oggetti stessi possono (e devono) condividere il bytecode e IIRC aggiunge solo un po 'di metadati (nome, modulo, docstring, variabili catturate, ecc.) In cima a quella. – delnan

+0

@delnan: vale solo per la funzione * local *, ovvero le funzioni definite all'interno delle funzioni. Il corpo della classe viene eseguito solo una volta e per le funzioni nel corpo della classe esiste una corrispondenza uno a uno tra oggetti funzione e oggetti codice. –

0

Le funzioni sono "memorizzate" nella classe, sia statiche che non statiche.

Problemi correlati