🏗️ 9.2 Atributos e Métodos de Classe
🎯 Objetivo
Aprender a controlar informações que pertencem à Classe e não a um objeto específico, como contadores globais, utilizando atributos de classe e o decorador @staticmethod.
🏗️ O Conceito: Atributos de Classe
Diferente dos atributos de instância (que usam self), um atributo de classe é compartilhado por todos os objetos criados a partir dela. Se um objeto altera esse valor, todos os outros “enxergam” a mudança.
Quando usar?
- Contar instâncias criadas.
- Armazenar configurações globais da classe.
- Definir constantes compartilhadas.
💻 Mão na Massa
Passo 1: Definindo o Atributo de Classe
No Python, definimos o atributo fora do __init__. Para incrementá-lo corretamente, devemos acessá-lo via nome da Classe (Conta._total_contas), garantindo que o valor seja alterado globalmente.
class Conta:
# Atributo de Classe (Privado)
_total_contas = 0
def __init__(self, saldo: float):
self._saldo = saldo
# Incrementa o contador global da classe
Conta._total_contas += 1
@staticmethod
def get_total_contas() -> int: """Método estático para acessar o contador sem precisar de uma instância."""
return Conta._total_contas
## Passo 2: Executando o Testeconta1 = Conta(100.0) conta2 = Conta(200.0)
Acessando via Classe (Recomendado)
print(f"Total de contas: {Conta.get_total_contas()}") # Resultado: 2
# Acessando via Instância (Também funciona)
print(f"Total via objeto: {conta1.get_total_contas()}") # Resultado: 2✅ Resultado Esperado
O console exibirá o número total de contas criadas, demonstrando que o valor é mantido na classe e não reiniciado a cada novo objeto.
Métodos Estáticos
O decorador
@staticmethodindica que o método não recebe a referênciaself. É ideal para utilitários que dependem apenas da classe ou de lógica lógica pura.
🚨 Erros Comuns
| Erro | Causa | Solução |
|---|---|---|
AttributeError | Tentar acessar self.total_contas esperando alterar o da classe. | Use sempre NomeDaClasse.atributo para alterações globais. |
TypeError: missing 'self' | Esquecer o @staticmethod em métodos que não usam instâncias. | Adicione o decorador @staticmethod no topo da função. |
🔗 Próximo Capítulo
Agora que controlamos a classe, vamos aprender sobre Métodos de Classe vs Estáticos.