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.
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 agoraO 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
TestarNeste 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é
TestarNeste 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 viacls
. - Um método estático não tem acesso a
cls
ouself
. 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.
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