Aplicando __slots__
en Clases de Python
Ahora que comprendes el concepto de __slots__
y sus beneficios, exploremos cómo aplicarlo en tus clases de Python.
Definiendo __slots__
Para usar __slots__
en una clase de Python, debes definir el atributo __slots__
como una lista o tupla de cadenas, donde cada cadena representa el nombre de un atributo permitido.
class Person:
__slots__ = ['name', 'age']
def __init__(self, name, age):
self.name = name
self.age = age
En el ejemplo anterior, la clase Person
tiene dos atributos permitidos: name
y age
.
Accediendo a Atributos
Cuando usas __slots__
, puedes acceder a los atributos de una instancia de la misma manera que con una clase normal:
person = Person('John Doe', 30)
print(person.name) ## Salida: John Doe
print(person.age) ## Salida: 30
Limitaciones y Consideraciones
Como se mencionó anteriormente, hay algunas limitaciones al usar __slots__
:
- No puedes agregar atributos dinámicos a una instancia de una clase con
__slots__
.
- No puedes heredar de una clase que no también defina
__slots__
.
- No puedes usar
__slots__
para definir propiedades o métodos.
Es importante considerar detenidamente los pros y contras y las limitaciones de __slots__
antes de aplicarlo a tus clases. En algunos casos, las economías de memoria pueden no valer la pena las restricciones adicionales.
Comparación de Rendimiento
Para ilustrar los beneficios de rendimiento de usar __slots__
, comparemos el uso de memoria de una clase con y sin __slots__
:
import sys
class PersonWithDict:
def __init__(self, name, age):
self.name = name
self.age = age
class PersonWithSlots:
__slots__ = ['name', 'age']
def __init__(self, name, age):
self.name = name
self.age = age
person_with_dict = PersonWithDict('John Doe', 30)
person_with_slots = PersonWithSlots('John Doe', 30)
print(f"Uso de memoria de PersonWithDict: {sys.getsizeof(person_with_dict)} bytes")
print(f"Uso de memoria de PersonWithSlots: {sys.getsizeof(person_with_slots)} bytes")
En un sistema Ubuntu 22.04, la salida de este código podría ser:
Uso de memoria de PersonWithDict: 64 bytes
Uso de memoria de PersonWithSlots: 56 bytes
Como puedes ver, la instancia de la clase PersonWithSlots
utiliza menos memoria que la instancia de la clase PersonWithDict
, lo que demuestra los beneficios de optimización de memoria de usar __slots__
.
Al entender cómo aplicar __slots__
en tus clases de Python, puedes optimizar efectivamente el uso de memoria de tus aplicaciones y mejorar su rendimiento general.