Tamanho de fonte
Alto contraste
Altura de linha

Entendendo @staticmethod e @classmethod em Python

Avatar de Luiza Cherobini Pereira Luiza Cherobini Pereira
4 minutos de leitura 8 meses atrás

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.

Curso Gratuito

Seu primeiro projeto Python – curso grátis com certificado!

Vá do zero ao primeiro projeto em apenas 2 horas com o curso Python para Iniciantes.

Comece agora

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.

Imagem de um notebook

Cursos de programação gratuitos com certificado

Aprenda a programar e desenvolva soluções para o seu trabalho com Python para alcançar novas oportunidades profissionais. Aqui na Asimov você encontra:

  • Conteúdos gratuitos
  • Projetos práticos
  • Certificados
  • +20 mil alunos e comunidade exclusiva
  • Materiais didáticos e download de código
Inicie agora

Comentários

Comentar
Faça parte da discussão Crie sua conta gratuita e compartilhe
sua opinião nos comentários
Entre para a Asimov