Skip to main content

Static em Python | @classmethod, @staticmethod, type(self) e self.__class__ | Python

  • Static em Python | @classmethod, @staticmethod, type(self) e self.__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

TipoDecoradorPrimeiro parâmetroPode acessar instância?Pode acessar classe?Exemplo de uso
Instância(nenhum)selfMétodos normais
Classe@classmethodclsCriar instâncias alternativas, alterar atributos de classe
Estático@staticmethodFunções utilitárias dentro da classe