Módulo 10 - Orientação a objetos avançada
classmethod e staticmethod
10 min de leitura · por Cesar Gargiulo, revisado pela equipe ValorFinal e GuardiaSec · Atualizado em 01/07/2026
O que você vai aprender
- Distinguir método de instância, de classe e estático.
- Usar @classmethod para criar construtores alternativos.
- Entender o parâmetro cls e como ele difere de self.
- Usar @staticmethod para funções relacionadas à classe.
Ouvir o resumo desta aula
Um recap de cerca de 2 minutos na voz do Valim, para ouvir no trânsito ou na academia.
Ler a transcrição do resumo
Resumo da aula: classmethod e staticmethod.
Os objetivos desta aula. Distinguir método de instância, de classe e estático. Usar @classmethod para criar construtores alternativos. Entender o parâmetro cls e como ele difere de self. Usar @staticmethod para funções relacionadas à classe.
Veja o essencial, parte por parte.
Três tipos de método. Método de instância recebe self e mexe no objeto: o caso comum.
classmethod e os construtores alternativos. Pense em cls como a fábrica que produz objetos: chamar cls(...) é apertar o botão de produzir uma instância.
staticmethod, a função que mora na classe. O @staticmethod é o mais simples de entender: é uma função comum que, por relação lógica, você guarda dentro da classe.
Esse foi o resumo do essencial. Para se aprofundar, leia a aula completa e responda os exercícios.
Três tipos de método
Até agora, todo método que você escreveu recebia self, a instância, como primeiro parâmetro. Esse é o método de instância, o mais comum, usado quando o código precisa ler ou alterar o estado de um objeto específico. Mas nem toda operação relacionada a uma classe age sobre uma instância. Às vezes você quer uma operação ligada à classe como um todo, e às vezes quer só agrupar uma função auxiliar dentro da classe, por organização. Para esses casos existem dois decoradores: o @classmethod e o @staticmethod. Entender qual usar é uma questão simples: pergunte de que o método precisa.
| Tipo | Primeiro parâmetro | Quando usar |
|---|---|---|
| Instância | self (o objeto) | Ler ou alterar o estado de uma instância |
| De classe | cls (a classe) | Agir sobre a classe; construtores alternativos |
| Estático | nenhum | Função auxiliar ligada à classe, sem acessar estado |
Pergunte de que o método precisa: o objeto, a classe ou nada.
classmethod e os construtores alternativos
O uso mais valioso do @classmethod é criar construtores alternativos. O __init__ é o construtor principal, mas às vezes você quer criar um objeto a partir de outro formato de dados, como uma string ou um dicionário. Poderia fazer isso com uma função solta, mas fica mais organizado e reutilizável como um método de classe. Ele recebe cls, que é a própria classe, e devolve cls(...), ou seja, uma nova instância. Usar cls em vez de escrever o nome da classe na mão tem uma vantagem: se alguém herdar da sua classe, o construtor alternativo passa a criar objetos da subclasse automaticamente, sem você mexer em nada.
class Data:
def __init__(self, dia, mes, ano):
self.dia = dia
self.mes = mes
self.ano = ano
@classmethod
def de_texto(cls, texto):
# cria uma Data a partir de "dia/mes/ano"
dia, mes, ano = (int(p) for p in texto.split("/"))
return cls(dia, mes, ano) # cls e a propria classe
def __repr__(self):
return f"Data({self.dia}, {self.mes}, {self.ano})"
d1 = Data(7, 9, 2025)
d2 = Data.de_texto("7/9/2025") # construtor alternativo
print(d2) # Data(7, 9, 2025)de_texto é um construtor alternativo: recebe cls e devolve cls(...), uma nova Data.
staticmethod, a função que mora na classe
O @staticmethod é o mais simples de entender: é uma função comum que, por relação lógica, você guarda dentro da classe. Ele não recebe self nem cls, porque não precisa nem da instância nem da classe; não lê nem altera estado nenhum. Você o usa para funções auxiliares que fazem sentido no contexto da classe mas não dependem de um objeto específico, como uma validação genérica ou um cálculo puro relacionado ao tema. Colocar essa função como método estático deixa claro que ela pertence àquele grupo, sem poluir o escopo do módulo com funções soltas.
class Temperatura:
def __init__(self, celsius):
self.celsius = celsius
@staticmethod
def celsius_para_fahrenheit(c):
# nao usa self nem cls: puro calculo relacionado ao tema
return c * 9 / 5 + 32
@property
def fahrenheit(self):
return Temperatura.celsius_para_fahrenheit(self.celsius)
print(Temperatura.celsius_para_fahrenheit(100)) # 212.0
t = Temperatura(25)
print(t.fahrenheit) # 77.0O staticmethod é chamada pura, sem self nem cls; útil como auxiliar organizada na classe.
A regra prática para escolher é direta. Se o método precisa do estado de uma instância, use um método de instância comum, com self. Se ele age sobre a classe, cria objetos dela ou lê algo da classe como um todo, use @classmethod, com cls. Se ele não precisa de nada disso e é só uma função auxiliar que combina com a classe, use @staticmethod. Na dúvida entre estático e uma função solta no módulo, ambos funcionam; o método estático vence quando a função é claramente parte do vocabulário daquela classe e você quer chamá-la a partir dela.
Teste rápido
Por que um construtor alternativo usa @classmethod com cls em vez de uma função comum?
Perguntas frequentes
- Qual a diferença prática entre self e cls?
- O self é a instância, o objeto específico sobre o qual o método age. O cls é a classe em si. Métodos de instância recebem self e mexem no objeto; métodos de classe recebem cls e agem sobre a classe, por exemplo criando novas instâncias com cls(...). O nome cls é convenção, assim como self.
- Quando prefiro classmethod a um segundo __init__?
- O Python só permite um __init__ por classe. Quando você quer várias formas de criar objetos, a partir de texto, dicionário ou outros formatos, os construtores alternativos com @classmethod são a solução idiomática. Cada um prepara os dados no seu jeito e chama cls(...) para produzir a instância final.
- Staticmethod é o mesmo que uma função no módulo?
- Em comportamento, quase: nenhum dos dois acessa estado de instância ou classe. A diferença é organizacional. O método estático vive dentro da classe e é chamado a partir dela, o que deixa claro que a função pertence àquele contexto. Use-o quando a função for parte do vocabulário da classe.
- Um classmethod pode acessar atributos da classe?
- Sim. Como recebe cls, ele pode ler e alterar atributos de classe, aqueles compartilhados por todas as instâncias, além de criar novos objetos com cls(...). Isso o torna útil não só para construtores alternativos, mas também para operações que mexem em configuração ou contadores no nível da classe.
- Posso chamar um staticmethod pela instância?
- Pode, tanto pela classe quanto por uma instância; o resultado é o mesmo, porque ele não usa self nem cls. Chamá-lo pela classe costuma deixar mais clara a intenção de que é uma função auxiliar independente do objeto. As duas formas são válidas e equivalentes.
Fontes
Seu progresso fica salvo neste aparelho. Assinantes sincronizam entre os aparelhos.