Static em Python | @classmethod, @staticmethod, type(self) e self.__class__ | Python
- Static em Python |
@classmethod,@staticmethod,type(self)eself.__class__| Python
🧩 1. Métodos de instância (padrão)
São os métodos normais, que recebem self como primeiro parâmetro.
Eles atuam sobre uma instância específica da classe.
class Pessoa:
def __init__(self, nome):
self.nome = nome # pertence à instância
def falar(self):
print(f"{self.nome} está falando...")
Uso:
p = Pessoa("Ana")
p.falar() # Ana está falando...
🏷️ 2. @classmethod
Um método de classe recebe a classe como primeiro parâmetro — chamado cls — em vez da instância (self).
- Ele pode acessar ou modificar atributos da classe (compartilhados entre todas as instâncias).
- É criado com o decorador
@classmethod.
Exemplo:
class Pessoa:
especie = "Humano"
def __init__(self, nome):
self.nome = nome
@classmethod
def mudar_especie(cls, nova_especie):
cls.especie = nova_especie
Uso:
Pessoa.mudar_especie("Ciborgue")
print(Pessoa.especie) # Ciborgue
p = Pessoa("Ana")
print(p.especie) # Ciborgue — também atualizado na instância
⚙️ 3. @staticmethod
Um método estático não recebe nem self nem cls.
É apenas uma função dentro da classe — útil por organização lógica (pertence conceitualmente à classe, mas não precisa de seus dados).
class Calculadora:
@staticmethod
def somar(a, b):
return a + b
Uso:
print(Calculadora.somar(2, 3)) # 5
👉 É como uma função normal, mas organizada dentro da classe.
🔍 4. type(self) e self.__class__
Ambos servem para pegar a classe da instância atual. São equivalentes na maioria dos casos.
class Animal:
def tipo(self):
print(type(self))
print(self.__class__)
Uso:
a = Animal()
a.tipo()
Saída:
<class '__main__.Animal'>
<class '__main__.Animal'>
🔸 Por que usar isso?
Você pode usar type(self) quando quer criar novas instâncias da mesma classe, dentro de um método — sem precisar saber o nome da classe.
Exemplo:
class Pessoa:
def __init__(self, nome):
self.nome = nome
def clonar(self):
return type(self)(self.nome) # cria outro objeto da mesma classe
Uso:
p1 = Pessoa("Ana")
p2 = p1.clonar()
print(p2.nome) # Ana
⚖️ Comparação rápida
| Tipo | Decorador | Primeiro parâmetro | Pode acessar instância? | Pode acessar classe? | Exemplo de uso |
|---|---|---|---|---|---|
| Instância | (nenhum) | self | ✅ | ✅ | Métodos normais |
| Classe | @classmethod | cls | ❌ | ✅ | Criar instâncias alternativas, alterar atributos de classe |
| Estático | @staticmethod | — | ❌ | ❌ | Funções utilitárias dentro da classe |