9.4 Para Saber Mais - Slots

Aprendemos sobre encapsulamento, e vimos que é uma boa prática proteger nossos atributos

incluindo o prefixo underscore em seus nomes, seguindo a convenção utilizada pelos programadores. Além disso, utilizamos properties para acessar e modificar nossos atributos. Mas como Python é uma linguagem dinâmica, nada impede que usuários de nossa classe Conta criem atributos em tempo de execução, fazendo, por exemplo:

conta.nome = “minha conta”

Esse código não acusa erro e nossa conta fica aberta a modificações ferindo a segurança da classe. Para evitar isso, podemos utilizar uma variável embutida no Python chamada slots , que pode guardar uma lista de atributos da classe definidos por nós:

class Conta:
python
slots = ['_numero', '_titular', '_saldo', '_limite']
python
def __init__(self, numero, titular, saldo, limite=1000.0): # inicialização dos atributos
 
# código omitido
 

Agora, quando tentamos adicionar um atributo na classe, recebemos um erro:

>>> conta.nome = "minha_conta" Traceback (most recent call last):
 
File <stdin>, line 1, in <module>
 

AttributeError: ‘Conta’ object has no attribute ’ dict ’ class Conta:

slots = ['_numero', '_titular', '_saldo', '_limite']
java
def __init__(self, numero, titular, saldo, limite=1000.0): self._numero = numero
 
self._titular = titular self._saldo = saldo self._limite = limite
 
# restante do código conta.nome = "minha_conta"
 

Repare que o erro acusa que a classe Conta não possui o atributo dict . Ao atribuir um valor

para slots , o interpretador do Python vai entender que queremos excluir o dict da classe

Conta não sendo possível criar atributos, ou seja, impossibilitando adicionar atributos ao dicionário da classe que é responsável por armazenar atributos de instância. Portanto, tentar chamar vars(conta) também vai gerar um erro:

vars(conta)

Traceback (most recent call last): File <stdin>, line 1, in <module>
 
TypeError: vars() argument must have dict attribute
 

Embora slots seja muito utilizado para não permitir que usuários de nossas classes criem

outros atributos, essa não é sua principal função nem o motivo de sua existência. O que acontece é que o

dict ‌

desperdiça muita memória. Imagine um sistema grande, com milhões de instâncias de

Conta - teríamos, consequentemente, milhões de dicionários de classe armazenando seus atributos de instância. O Python não pode simplesmente alocar uma quantidade estática de memória na criação de objetos para armazenar todos os atributos. Por isso, consome muita memória RAM se você criar muitos objetos.

Para contornar este problema é que se usa o slots , e este é seu principal propósito. O

slots

de atributos.

avisa o Python para não usar um dicionário e apenas alocar espaço para um conjunto fixo

Programadores viram uma redução de quase 40 a 50% no uso de RAM usando essa técnica.


⬅️ Capítulo Anterior | Próximo Capítulo ➡️