Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

[Dúvida] Existe a possibilidade de chamar a função msg_personalizada através da classe Pessoa igual eu fiz com a saudação(Pessoa.saudacao)?

class Pessoa:
    pessoas = []
    def __init__(self, nome='', idade=0, profissao=''):
        self._nome = nome
        self._idade = idade
        self._profissao = profissao
        Pessoa.pessoas.append(self)
    def __str__(self):
        return f'{self._nome}, {self._idade} anos, {self._profissao}\n'
    
    @classmethod
    def saudacao(cls):
        print('Informações iniciais:\n')
        for pessoa in Pessoa.pessoas:
            print(f'Olá, eu sou {pessoa._nome} e tenho {pessoa._idade} anos e minha profissão é {pessoa._profissao}.')
        
        print('Informações pós aniversário:\n')
        for pessoa in Pessoa.pessoas:
            pessoa._idade += 1
            print(f'Olá, eu sou {pessoa._nome} e tenho {pessoa._idade} anos e minha profissão é {pessoa._profissao}.')
    
    @property
    def msg_personalizada(self):
        for pessoa in Pessoa.pessoas:
            print(f'\nO(a) candidato(a) {pessoa._nome} tem a vaga para {pessoa._profissao} em nosso escritório.')


pessoa1 = Pessoa(nome='Evert', idade=25, profissao='Desenvolvedor Python')
pessoa2 = Pessoa(nome='Maria', idade=30, profissao='Designer Gráfica')

Pessoa.saudacao()

pessoa1.msg_personalizada
2 respostas
solução!

Olá, Everton! Tudo bem?

No seu código, a função saudacao é um método de classe (@classmethod), o que permite que você a chame diretamente pela classe usando Pessoa.saudacao(). Já o msg_personalizada está definido como uma propriedade (@property), acessada por instâncias da classe, como pessoa1.msg_personalizada.

Para chamar msg_personalizada diretamente pela classe, você pode:

  1. Transformar msg_personalizada em um método de classe:

    Se você quer que msg_personalizada funcione da mesma forma que saudacao, ou seja, chamável pela classe (Pessoa.msg_personalizada()), use o decorador @classmethod:

    @classmethod
    def msg_personalizada(cls):
        for pessoa in cls.pessoas:
            print(f'\nO(a) candidato(a) {pessoa._nome} tem a vaga para {pessoa._profissao} em nosso escritório.')
    

    Uso:

    Pessoa.msg_personalizada()
    
  2. Manter como propriedade, mas usar na instância:

    Se quiser manter msg_personalizada como uma propriedade, o acesso deve continuar sendo feito pela instância, sem parênteses:

    pessoa1.msg_personalizada
    

Diferença entre as abordagens:

  • @classmethod: Pode ser chamado diretamente pela classe ou instância e geralmente manipula atributos de classe (como a lista pessoas).
  • @property: Acessa informações específicas de uma instância, simulando o acesso a um atributo.

No seu caso, como msg_personalizada lida com todas as pessoas (atributo da classe), o mais apropriado é usar o @classmethod.

Espero ter ajudado e bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓.

Obrigado Armano, preciso estudar mais sobre quando utilizar classmethod e property, se tiver alguma dica desde já agradeço.