2012-08-13 8 views
6

Si tengo una clase con varias funciones:Python: funciones en una clase y la memoria

class Example: 

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

Si creo varios casos de 'Ejemplo', lo hace cada tienda instancia sus propias copias de las funciones de la clase ? ¿O Python tiene una manera inteligente de almacenar la definición una sola vez y buscarla cada vez que una instancia utiliza una función en la clase?

Además, ¿qué ocurre con las funciones estáticas? ¿La clase guarda solo una copia de cada función estática?

+0

No estoy seguro de entender la diferencia en el rendimiento que esto implicaría. – rsegal

+0

im instanciando millones de instancias de una clase, así que necesito entender cómo se va a afectar la memoria. –

Respuesta

12

Al crear una instancia de una clase, no se crean nuevos objetos de función, ni para métodos de ejemplo ni para métodos estáticos. Al acceder a un método de instancia a través del obj.func1, se crea un nuevo objeto envoltorio llamado "método enlazado", que solo se mantendrá el tiempo que sea necesario. El objeto contenedor es liviano y contiene básicamente un puntero al objeto de función subyacente y la instancia (que se pasa como parámetro self cuando se llama a la función).

Tenga en cuenta que el uso de staticmethod es casi siempre un error en Python. Debe su existencia a un error histórico. Por lo general, desea una función de nivel de módulo si cree que necesita un método estático.

+0

Bien puesto y comprensible - buena nota acerca de los métodos estáticos también –

+0

También tenga en cuenta que las funciones de los objetos pueden (y comparten) bytecode, y IIRC solo agrega un poco de metadatos (nombre, módulo, docstring, variables capturadas, etc.) encima de ese. – delnan

+0

@delnan: Eso solo es cierto para la función * local *, es decir, funciones definidas dentro de funciones. El cuerpo de la clase se ejecuta solo una vez, y para las funciones en el cuerpo de la clase, existe una correspondencia de uno a uno entre los objetos de función y los objetos de código. –

0

Las funciones están "almacenadas" en la clase, tanto estáticas como no estáticas.

Cuestiones relacionadas