2011-02-01 13 views
6

¿Cómo es que este código funciona para mí?No sé cómo hacer que __slots__ funcione

class Foo(): 
    __slots__ = [] 
    def __init__(self): 
     self.should_not_work = "or does it?" 
     print "This code does not run,",self.should_not_work 

Foo() 

pensé ranuras trabajaron como una restricción. Estoy ejecutando Python 2.6.6.

Respuesta

8

El mecanismo __slots__ funciona para las clases de nuevo estilo. Debe heredar de object.

Cambiar la declaración de clase a

class Foo(object): 
    # etc... 
+1

Funciona muy bien! ¡Gracias! –

9

__slots__ proporciona una pequeña optimización del uso de la memoria, ya que puede impedir que un __dict__ siendo asignada para almacenar atributos de la instancia. Esto puede ser útil si tienes una gran cantidad de instancias.

La restricción de la que está hablando es principalmente un efecto secundario accidental de la forma en que se implementa. En particular, solo detiene la creación de un __dict__ si su clase hereda de una clase base que no tiene un __dict__ (como object) e incluso entonces no se detendrá __dict__ asignándose en ninguna subclase a menos que también definan __slots__. No pretende ser un mecanismo de seguridad, por lo que es mejor no intentar usarlo como tal.

Todas las clases antiguas obtienen __dict__ automáticamente, por lo que __slots__ no tiene ningún efecto. Si heredas de object obtendrás el efecto que estás buscando, pero básicamente no te molestes con __slots__ hasta que sepas que tienes millones de instancias y que la memoria es un problema.

Cuestiones relacionadas