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

[Sugestão] Mão na massa: refatorando uma função

class Pessoa:
    """
    Representa uma pessoa com nome, idade e profissão.

    Esta classe implementa validações para garantir que a idade permaneça
    dentro de um limite realista (1 a 150 anos) e fornece feedback
    ao usuário caso esses limites sejam excedidos.
    """
    # Constantes da classe para fácil manutenção dos limites de idade
    IDADE_MINIMA = 1
    IDADE_MAXIMA = 150

    def __init__(self, nome: str = '', idade: int = 1, profissao: str = ''):
        """
        Inicializa uma nova instância da classe Pessoa.
        """
        self.nome = nome.capitalize()
        self.profissao = profissao.capitalize()
        # A atribuição inicial já aciona o método setter para validar a idade
        self.idade = idade

    @property
    def idade(self) -> int:
        """
        Getter (obtem o valor): Retorna a idade da pessoa.
        O valor real é armazenado no atributo "privado" _idade.
        """
        return self._idade

    @idade.setter
    def idade(self, valor: int):
        """
        Setter (define o valor): Valida e define a idade da pessoa.
        Esta é a lógica central que protege o atributo idade.
        """
        try:
            idade_num = int(valor)
        except (ValueError, TypeError):
            # Se o valor não for um número (ex: "abc"), assume a idade mínima
            idade_num = self.IDADE_MINIMA

        # Validação do limite máximo com mensagem de erro customizada
        if idade_num > self.IDADE_MAXIMA:
            print(f"--- ERRO ---")
            print(f"A idade informada ({idade_num}) é superior ao limite de {self.IDADE_MAXIMA} anos.")
            print("Este valor ultrapassa os registros de longevidade humana conhecidos.")
            print(f"A idade será definida para o valor máximo permitido: {self.IDADE_MAXIMA} anos.")
            print("-" * 12)
            self._idade = self.IDADE_MAXIMA
        # Validação do limite mínimo
        elif idade_num < self.IDADE_MINIMA:
            self._idade = self.IDADE_MINIMA
        # Se a idade for válida
        else:
            self._idade = idade_num

    def __str__(self) -> str:
        """
        Retorna a representação em string do objeto, legível.
        """
        # Lógica para usar "ano" ou "anos" corretamente
        unidade_tempo = "ano" if self.idade == 1 else "anos"
        return f'{self.nome}, {self.idade} {unidade_tempo} - {self.profissao}'

    @property
    def saudacao_formal(self) -> str:
        """
        Retorna uma propriedade computada com uma saudação formal.
        """
        return f'{self.profissao} {self.nome}'

    def aumentar_idade(self, quantidade: int = 1):
        """
        Aumenta a idade da pessoa pela quantidade especificada.
        A validação do setter é acionada automaticamente.
        """
        if isinstance(quantidade, int) and quantidade > 0:
            self.idade += quantidade
        else:
            print("A quantidade para aumentar a idade deve ser um número inteiro positivo.")


# --- Demonstração de Uso ---

print("1. Criando uma pessoa com idade válida:")
p1 = Pessoa('Mariana', 42, 'Cientista de Dados')
print(f"   -> {p1}\n")

print("2. Criando uma pessoa com 1 ano de idade (teste do singular):")
p2 = Pessoa('Enzo', '1', 'Bebê Profissional') # Idade como string para testar conversão
print(f"   -> {p2}\n")

print("3. Tentando criar uma pessoa com idade superior ao limite (180 anos):")
p3 = Pessoa('Duncan MacLeod', 180, 'Imortal')
print(f"   -> Objeto resultante: {p3}\n")

print("4. Aumentando a idade de uma pessoa para ultrapassar o limite:")
p4 = Pessoa('Júlia', 148, 'Supercentenária')
print(f"   Idade inicial: {p4.idade}")
p4.aumentar_idade(5) # 148 + 5 = 153, o que vai disparar o erro
print(f"   Idade final: {p4.idade}\n")

print("5. Usando a property 'saudacao_formal':")
print(f"   -> {p1.saudacao_formal}")
1 resposta
solução!

Oi, Marinaldo! Como vai?

Agradeço por compartilhar seu código com a comunidade Alura.

Foi bom o uso de @property com validação no setter de idade, o controle claro por constantes (IDADE_MINIMA/IDADE_MAXIMA) e o cuidado com pluralização em __str__.

Parabéns por praticar.

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