Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

[Dúvida] Funcionalidade @property e @classmethod em classes

Vi nas aulas que existe a possibilidade de transformar um método de classe em uma propriedade que pode ser um atributo acessível com o @property.

Mas ainda não compreendi com clareza o que isto faz. Gostaria de uma explicação um pouco diferente disso e entender quais os benefícios de utilizar esta funcionalidade na prática para outras aplicações.

Se possível, gostaria que fizesse um paralelo com o @classmethod também, para entender quando seria necessário utilizar.

Abaixo, estrutura do último código que executei com esta função também.

class Pessoa:
    def __init__(self, nome='', idade=0, profissao=''):
        self.nome = nome.title()
        self.idade = idade
        self.profissao = profissao
        
    def __str__(self):
        return f'{self.nome} com idade de {self.idade} anos e profissão {self.profissao}.'
    
    def aniversario(self):
        self.idade += 1
        print(f'Feliz aniversário {self.nome}! Completou {self.idade} aninhos!')

    @property
    def saudacao(self):
        return f'Saudações, {self.nome}! Adoramos ter um(a) {self.profissao} conosco!'
1 resposta
solução!

Oi, Renato.

O que é o @property?

Imagine que você tem um dado que não existe fisicamente como uma variável fixa, mas que pode ser calculado a partir de outras informações. Ou imagine que você quer proteger um atributo para que ninguém mude o valor dele sem passar por uma validação.

O @property transforma um método em um atributo virtual.

Por que usar?

  1. Sintaxe limpa: Você acessa como pessoa.saudacao em vez de chamar uma função pessoa.saudacao().
  2. Lógica oculta: O usuário da sua classe acha que está apenas lendo uma variável, mas por trás você pode estar formatando strings, fazendo cálculos ou buscando dados em outro lugar.
  3. Proteção: Você pode criar propriedades que só permitem a leitura, impedindo que alguém altere um valor importante acidentalmente.

Exemplo prático:
Pense em um retângulo. Você tem a largura e a altura. A area não precisa ser guardada em uma variável (pois se a largura mudar, a área guardada ficaria errada). Você cria uma @property area que calcula o valor na hora em que for pedida.

O que é o @classmethod?

Enquanto os métodos comuns trabalham com os dados de uma pessoa específica (o self), o @classmethod trabalha com a classe como um todo (o cls).

Por que usar?

  1. Fábricas de objetos: Usado para criar novas instâncias de formas diferentes. Por exemplo, criar uma Pessoa a partir de um ano de nascimento em vez da idade direta.
  2. Configurações globais: Alterar algo que afete todos os objetos daquela classe simultaneamente.

Comparação Direta

Característica@property@classmethod
FocoO objeto individual (instância).A estrutura da classe.
Acessoobjeto.nome_propriedade (sem parênteses).Classe.metodo() ou objeto.metodo().
ReferênciaUsa self para acessar dados do objeto.Usa cls para acessar a própria classe.
IntuitoRepresentar um dado/estado.Executar uma ação lógica da classe.

Exemplo aplicado:

Vamos ajustar sua classe para mostrar os dois em ação:

class Pessoa:
    def __init__(self, nome='', idade=0, profissao=''):
        self.nome = nome.title()
        self.idade = idade
        self.profissao = profissao
    
    # PROPERTY: se comporta como um atributo (valor)
    @property
    def saudacao(self):
        return f'Saudações, {self.nome}! Profissão: {self.profissao}'

    # CLASSMETHOD: uma "fábrica" para criar pessoas de outro jeito
    @classmethod
    def criar_crianca(cls, nome):
        # retorna uma nova instância da classe com idade 0 e sem profissão
        return cls(nome, 0, 'Estudante')

# uso da Property (acesso direto)
alguem = Pessoa('Renato', 30, 'Dev')
print(alguem.saudacao) 

# uso do Classmethod (chamado pela Classe)
crianca = Pessoa.criar_crianca('Zezinho')
print(crianca)

No seu código original, a saudacao faz total sentido como @property porque ela descreve um estado daquela pessoa específica. Já o @classmethod seria útil se você precisasse de uma função para contar quantas pessoas foram criadas no total ou para criar perfis padrão de usuários.

Espero ter ajudado.

Conteúdos relacionados
Alura Conte com o apoio da comunidade Alura na sua jornada. Abraços e bons estudos!