e quando usar o classmethod
e quando usar o classmethod
O @classmethod permite que você chame o metodo de uma classe sem precisar instânciar a classe, como no exemplo abaixo:
class Escritor():
def __init__(self):
pass
def escreve(self, text):
print(text)
@classmethod
def escreve_novo(cls, text):
print(text)
Escritor.escreve("Olá!") # Não vai executar
Escritor.escreve_novo("Olá!") # Vai executar
O método "escreve" só vai funcionar quando a classe for instânciada enquando o metodo "escreve_novo" pode ser chamado direto da classe:
instancia_escritor = Escritor() # Cria a Instância
instancia_escritor.escreve("Olá!") # Vai executar
Você deve utilizar essa marcação quando você quer criar um método de uma classe que pode ser chamado diretamente, sem ser instânciado.
entendi, mais o saticmethod, ja faz isso? qual seria a diferença entre ambos?
O staticmethod não recebe a classe como referência enquanto o classmethod recebe.
class Teste:
@staticmethod
def static_method(): # não recebe cls
pass
@classmethod
def class_method(cls): # recebe cls
pass
Podemos usar o classmethod como construtor da nossa classe, recebendo um objeto de outra classe ou até da mesma, como no exemplo abaixo:
class Pessoa():
def __init__(self, altura, idade):
self.altura = altura
self.idade = idade
class Aluno():
def __init__(self, altura, idade):
self.altura = altura
self.idade = idade
@classmethod
def construir_aluno_pessoa(cls, pessoa):
return cls(pessoa.altura, pessoa.idade)
def estudar(self):
print("Estou estudando")
joao = Pessoa(1.85, 18)
mariaAluna = Aluno(1.68, 18)
mariaAluna.estudar()
# Construindo classe Aluno recebendo uma instancia da classe pessoa
joaoAluno = Aluno.construir_aluno_pessoa(joao)
joaoAluno.estudar()
Vale ressaltar que por convenção usamos o cls para referênciar a classe no classmethod, no lugar onde ficaria o self.
Obigado, entao o @classmethod nada mais é que um decorador que pode ser usado como um subconstrutor