Além dos métodos de instância (que recebem self
), Python oferece outros tipos de métodos:
Métodos de Classe (@classmethod
): Recebem a própria classe (cls
) como primeiro argumento em vez da instância. Eles operam em atributos de classe e podem ser usados para criar métodos de fábrica ou métodos que operam na classe como um todo, não em uma instância específica.
class Pessoa:
total_pessoas = 0 # Atributo de classe
def __init__(self, nome):
self.nome = nome
Pessoa.total_pessoas += 1 # Incrementa o contador ao criar uma pessoa
@classmethod
def contar_pessoas(cls): # Recebe a classe 'cls'
return cls.total_pessoas
@classmethod
def criar_de_string(cls, dados_string): # Método de fábrica
nome, idade = dados_string.split('-')
return cls(nome) # Cria uma nova instância da classe
p1 = Pessoa("Alice")
p2 = Pessoa("Bob")
print(Pessoa.contar_pessoas()) # Saída: 2 (chamado pela classe)
print(p1.contar_pessoas()) # Saída: 2 (também pode ser chamado pela instância)
p3 = Pessoa.criar_de_string("Charlie-30")
print(p3.nome) # Saída: Charlie
print(Pessoa.contar_pessoas()) # Saída: 3
Métodos Estáticos (@staticmethod
): Não recebem nem self
nem cls
como primeiro argumento. São funções que pertencem logicamente à classe, mas não operam nem em atributos de instância nem em atributos de classe. São como funções utilitárias dentro do escopo da classe.
class UtilitariosMatematicos:
@staticmethod
def somar(a, b):
return a + b
@staticmethod
def eh_par(numero):
return numero % 2 == 0
print(UtilitariosMatematicos.somar(5, 3)) # Saída: 8
print(UtilitariosMatematicos.eh_par(4)) # Saída: True
# Não precisam de uma instância para serem chamados