Decoradores classmethod e staticmethod em Python

Ana Maria Gomes
4 minutos de leitura

Conteúdos do tutorial

Quando você está aprendendo Python, pode se deparar com decoradores como @classmethod e @staticmethod. Eles são usados para definir métodos dentro de uma classe que não estão conectados a uma instância específica dessa classe. Vamos entender o que cada um desses decoradores significa, como eles diferem e quando você deve usá-los.

O que é um @classmethod?

Um @classmethod é um método que recebe a classe como primeiro argumento em vez da instância. Isso significa que você pode acessar atributos e métodos de nível de classe a partir deste método. Um uso comum de @classmethod é para definir construtores alternativos.

Exemplo de @classmethod

class Data:
    def __init__(self, dia=0, mes=0, ano=0):
        self.dia = dia
        self.mes = mes
        self.ano = ano

    @classmethod
    def de_string(cls, data_em_string):
        dia, mes, ano = map(int, data_em_string.split('-'))
        return cls(dia, mes, ano)

Neste exemplo, de_string é um método de classe que nos permite criar um objeto Data a partir de uma string. O argumento cls refere-se à própria classe Data, não a uma instância. Isso é útil porque se criarmos uma subclasse de Data, o método de_string criará automaticamente uma instância da subclasse, e não apenas um objeto Data.

O que é um @staticmethod?

Um @staticmethod é semelhante a um @classmethod, mas não recebe nenhum parâmetro obrigatório como self ou cls. É uma maneira de incluir uma função dentro de uma classe que não acessa nenhum dado específico da classe ou da instância.

Exemplo de @staticmethod

class Data:
    # ... (código anterior)

    @staticmethod
    def data_e_valida(data_em_string):
        dia, mes, ano = map(int, data_em_string.split('-'))
        return dia <= 31 and mes <= 12 and ano <= 3999

Aqui, data_e_valida é um método estático que valida uma string de data. Como ele não precisa modificar ou acessar quaisquer propriedades da classe Data, ele é definido como um método estático.

Quando e Por Que Usá-los?

Use @classmethod quando você precisar acessar a classe dentro do seu método, como quando você está criando métodos de fábrica que retornam uma instância da classe.

Use @staticmethod quando você quiser agrupar uma função de utilidade com uma classe, mas a função não precisa acessar nenhum dado específico da classe ou da instância.

Como Usá-los?

Para usar @classmethod, sempre passe cls como o primeiro parâmetro. Para @staticmethod, você não precisa passar nenhum parâmetro especial relacionado à classe ou instância.

Resumo

Resumindo, @classmethod e @staticmethod servem a propósitos diferentes em Python. Use @classmethod para métodos que precisam acessar atributos ou métodos da classe, e @staticmethod para funções de utilidade que estão logicamente relacionadas à classe, mas operam independentemente do estado da classe e da instância. Entender quando e como usar esses decoradores ajudará você a escrever um código Python mais flexível e fácil de manter.

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: