07.12.2012 Views

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

SHOW MORE
SHOW LESS

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

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!