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.