versión color - PET: Python Entre Todos - Python Argentina
versión color - PET: Python Entre Todos - Python Argentina
versión color - PET: Python Entre Todos - Python Argentina
You also want an ePaper? Increase the reach of your titles
YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.
21 Referencias: PyObject<br />
class Registro(object)<br />
__slots__ = ( 'id', 'nombre', 'dato1', 'dato2' )<br />
def __init__(self, id, nombre, dato1, dato2):<br />
self.id = id<br />
self.nombre = nombre<br />
self.dato1 = dato1<br />
self.dato2 = dato2<br />
Esta clase “Registro” ocupará, exactamente, GC + PyObject + 4 punteros, mucho más eficiente que una clase normal, igual de<br />
eficiente que las tuplas con nombre. No soporta referencias débiles ni atributos arbitrarios.<br />
Este mecanismo sólo funciona con clases nuevas (que heredan de object), si se intentara usar sobre clases viejas (que no<br />
heredan de object), no tendrá efecto.<br />
Si queremos referencias débiles, se deberá incluir __weakref__ a los __slots__, y si queremos atributos arbitrarios habrá de<br />
agregarse __dict__ a los mismos, aunque así habremos perdido mucha de las ventajas de utilizar __slots__.<br />
El acceso a través de slots es apenas más lento que usando una clase regular, lo cual es algo anti-intuitivo dado que pareciera<br />
más rápido. Pero <strong>Python</strong> debe asociar el nombre del atributo a un offset dentro del PyObject, lo cual se hace de manera menos<br />
eficiente que a través de los altamente optimizados diccionarios de <strong>Python</strong>.<br />
La pérdida de eficiencia en tiempo de acceso bien vale el ahorro de memoria, sin embargo, y cuando los datos son masivos,<br />
puede que incluso resulte en un programa más rápido, puesto que deberá barajar menos memoria para realizar su trabajo.<br />
Otra ventaja es que ahora el objeto está contenido en una estructura compacta, sin la indirección del diccionario. Esto es una<br />
gran mejora, pues reduce notoriamente la fragmentación de memoria y, nuevamente, puede acelerar el programa con datos<br />
masivos.<br />
class SubRegistro(Registro):<br />
pass<br />
Al contrario de lo que pueda parecer, la clase SubRegistro sí tiene un diccionario. Para mantener las ventajas de los slots, es<br />
necesario especificarlos (aunque sea una lista vacía) en las subclases, o volverán a utilizar el diccionario como en las clases<br />
regulares. Para que esto no suceda:<br />
class SubRegistro(Registro):<br />
__slots__ = ()<br />
Esta clase heredará los slots de Registro, aunque no estén especificados. Si se agregaran slots a una clase base que no los<br />
utilice, la clase seguirá teniendo un diccionario, y no tendrá efecto.<br />
Además, no funcionará la práctica usual de usar variables de clase como default de las correspondientes variables de instancia:<br />
class Algo:<br />
verdadero = True<br />
>>> a = Algo()<br />
>>> a.verdadero<br />
True<br />
>>> a.verdadero = False<br />
>>> a.verdadero<br />
False<br />
>>> Algo().verdadero<br />
True<br />
class Algo(object):<br />
__slots__ = ('verdadero',)<br />
verdadero = True<br />
>>> a = Algo()<br />
<strong>Python</strong> <strong>Entre</strong> <strong>Todos</strong> (número 5, Marzo 2012) — http://revista.python.org.ar