4
respostas

Para que Serve o @classmethod

e quando usar o classmethod

4 respostas

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