1
resposta

Dúvida Métodos estáticos e de classe

Na atividade "Métodos estáticos e de classe" aparecem duas novas definições de Métodos de classe e Métodos estáticos, representados respectivamente com os seguintes exemplos:

class Funcionario:
    prefixo = 'Instrutor'

    @classmethod
    def info(cls):
        return f'Esse é um {cls.prefixo}'
class FolhaDePagamento:
    @staticmethod
    def log():
        return f'Isso é um log qualquer'

Como seria uma aplicação prática desses dois métodos? Como eles seriam chamados?

1 resposta

Oii Francisco, como você está? Espero que esteja bem ^-^

Sinto muito pela demora em obter um retorno.

Para exemplificar melhor, irei apresentar a classe "Pessoa":

from datetime import date


class Pessoa:

    def __init__(self, nome, idade):
        self.nome = nome
        self.idade = idade

    @classmethod
    def ano_de_nascimento(cls, nome, ano):
        return cls(nome, date.today().year - ano)

    @staticmethod
    def adulto(idade):
        return idade > 18

No método estático demarcado pelo decorator "staticmethod", observe que não utilizamos a referência para o objeto, ou seja, a palavrinha "self" e nem a referência de classe "cls", veja que ele recebe apenas um parâmetro que se refere ao argumento que ele espera receber, nesse caso, a idade. Outra peculiaridade de um método estático é que não precisamos instanciar a classe para utilizá-lo, podemos chamá-lo diretamente (isso ficará claro no exemplo de chamada desse método).

E isso ocorre porque um método estático não pode modificar o estado do objeto nem o estado da classe, ele funciona como uma espécie de método utilitário. No caso do exemplo de código acima, queremos apenas saber se uma determinada idade de uma pessoa pode ser considerada adulta ou não, então não precisamos necessariamente termos um objeto para isso. Veja como fica o uso desse método:

print(f'É adulto? {Pessoa.adulto(23)}')
print(f'É adulto? {Pessoa.adulto(17)}')

#Resultado:

É adulto? True
É adulto? False

Já o método de classe que recebe como parâmetro a palavrinha "cls" pode modificar e acessar atributos da classe. Ele é muito utilizado para o uso de construtores de classe alternativos. Observe no código que inicialmente para instanciar um objeto da classe "Pessoa" é necessário passarmos o nome e a idade . Porém, ao utilizar um método de classe podemos instanciar um objeto de modo diferente, e nesse caso, iremos passar o nome e o ano de nascimento da pessoa. Veja:

# instanciando normal
pessoa1 = Pessoa("Nádia", 21)
# instanciando a partir do método de classe
pessoa2 = Pessoa.ano_de_nascimento("Nádia", 1999)
print(pessoa2.idade)

Por fim, um resumo:

image

Qualquer estou por aqui, tá bom?

Grande abraço!