Entendendo @staticmethod e @classmethod em Python

Juliano Faccioni
5 minutos de leitura

Conteúdos do tutorial

Quando você está se aprofundando no mundo do Python, você encontrará várias maneiras de definir métodos dentro de uma classe. Duas dessas maneiras são usando os decoradores @staticmethod e @classmethod. Entender a diferença entre esses dois pode ser crucial para escrever um código eficiente e fácil de manter. Vamos explorar o que os diferencia.

O que é um @staticmethod?

Um @staticmethod (ou método estático) é um método que se comporta como uma função regular, mas pertence a uma classe. Internamente, o método não tem acesso nem à classe (cls), nem à instância (self) na qual é chamado. Isso significa que ele não pode modificar o estado da instância do objeto nem o estado da classe.

Em geral, métodos estáticos são usados para agrupar funções que têm uma conexão lógica com uma classe, apesar de não usar seus atributos diretamente.

Aqui está um exemplo simples:

class Calculadora:
    @staticmethod
    def somar(x, y):
        return x + y

# Método estático chamado usando o nome da classe
print(Calculadora.somar(5, 3))  # Saída: 8
Testar

Neste exemplo, somar é um método estático que simplesmente retorna a soma de dois números. Note que ele apenas recebe dois argumentos, x e y, e não recebe um parâmetro representando a instância (self) ou a classe (cls).

O que é um @classmethod?

Por outro lado, um @classmethod (método de classe) é um método que recebe a classe como o primeiro argumento. Isso é útil para casos em que você precisa ter acesso ao objeto da classe, por exemplo, quando você quer criar métodos alternativos para inicializar uma instância da classe.

Aqui está um exemplo para ilustrar:

class Bebida:
    nome = "Bebida"

    @classmethod
    def imprimir_nome(cls):
        print(f"Esta é uma {cls.nome}")

class Café(Bebida):
    nome = "Café"

# Método de classe chamado usando o nome da classe
Bebida.imprimir_nome()  # Saída: Esta é uma Bebida
Café.imprimir_nome()    # Saída: Esta é um Café
Testar

Neste caso, imprimir_nome é um método de classe que imprime o nome da classe na qual é chamado. Quando chamado na classe Bebida, ele imprime “Bebida”, e quando chamado na subclasse Café, ele imprime “Café”.

Diferenças Práticas

Para esclarecer ainda mais, considere o seguinte trecho de código:

class MinhaClasse:
    def metodo(self):
        return 'método de instância chamado', self

    @classmethod
    def metodo_de_classe(cls):
        return 'método de classe chamado', cls

    @staticmethod
    def metodo_estatico():
        return 'método estático chamado'
Testar
  • Um método de instância requer uma instância da classe e pode acessar a instância através de self.
  • Um método de classe não requer uma instância. Ele não pode acessar a instância (self), mas pode acessar o objeto da classe via cls.
  • Um método estático não tem acesso a cls ou self. Ele funciona como uma função regular, mas pertence ao namespace da classe.

Resumo

Em resumo, @staticmethod e @classmethod em Python são usados para definir métodos que não estão vinculados a uma instância da classe. Um @staticmethod não recebe um primeiro argumento implícito de forma alguma, é como uma função regular que pertence a uma classe. Um @classmethod, no entanto, recebe a classe como o primeiro argumento implícito, permitindo que ele acesse variáveis e métodos da classe. Entender quando usar cada um pode ajudá-lo a escrever um código que não é apenas mais limpo, mas também mais intuitivo.

Inscreva-se gratuitamente e fique atualizado

Receba toda semana um resumo dos principais conteúdos da Asimov direto no seu e-mail. 100% livre de spam.

Áreas de interesse: