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.
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
Comentários