Fácil Python

Temperatura com property

Enunciado

Crie uma classe Temperatura que armazena graus Celsius em um atributo privado _celsius. Use @property para expor celsius (getter) e um setter que não permita valores abaixo de -273.15 (zero absoluto). Se o valor for inválido, lance ValueError com a mensagem 'Temperatura abaixo do zero absoluto'.

Requisitos

  • A classe deve ter um getter celsius usando @property.
  • O setter deve validar se o valor é maior ou igual a -273.15.
  • O construtor deve aceitar um valor inicial e usar o setter para armazená-lo.

Código inicial

class Temperatura:
    def __init__(self, celsius):
        pass  # inicialize usando o setter

    @property
    def celsius(self):
        pass  # retorne o valor armazenado

    @celsius.setter
    def celsius(self, valor):
        pass  # valide e armazene

Saída esperada

25.0
Erro: Temperatura abaixo do zero absoluto
Ver dica

No setter, verifique se valor < -273.15 e lance ValueError. No __init__, chame self.celsius = celsius para passar pelo setter.

Mostrar solução
class Temperatura:
    def __init__(self, celsius):
        self.celsius = celsius  # usa o setter para validar

    @property
    def celsius(self):
        return self._celsius

    @celsius.setter
    def celsius(self, valor):
        if valor < -273.15:
            raise ValueError('Temperatura abaixo do zero absoluto')
        self._celsius = valor

# Teste
t = Temperatura(25)
print(t.celsius)
try:
    t.celsius = -300
except ValueError as e:
    print(f'Erro: {e}')

Passo a passo

  1. Definimos a classe Temperatura com um construtor que recebe celsius e atribui a self.celsius. Isso aciona o setter, garantindo a validação desde a criação.
  2. O getter celsius é decorado com @property e simplesmente retorna self._celsius, o atributo interno que guarda o valor.
  3. O setter é definido com @celsius.setter. Ele verifica se o valor é menor que -273.15 e, se for, lança ValueError com a mensagem especificada.
  4. Se o valor for válido, armazena em self._celsius. O uso do underscore evita conflito com o nome da property.
  5. No teste, criamos uma instância com 25 e imprimimos t.celsius, que chama o getter e exibe 25.0.
  6. Tentamos atribuir -300, o que dispara o setter, lança ValueError e capturamos a exceção, imprimindo a mensagem de erro.

Por que funciona

A property permite que o acesso a celsius pareça um atributo comum, mas internamente executa código. O setter valida antes de armazenar, garantindo que o objeto nunca tenha um valor inválido. O construtor usa a mesma via, então a validação ocorre desde o início.

Erros comuns

  • Esquecer o _ no atributo interno: se usar self.celsius = valor dentro do setter, ocorre recursão infinita porque o setter chama a si mesmo. Use self._celsius.
  • Não lançar exceção: apenas imprimir uma mensagem não impede que o valor inválido seja armazenado. Use raise ValueError(...).
  • Não usar o setter no __init__: se fizer self._celsius = celsius diretamente, a validação não ocorre na criação. Prefira self.celsius = celsius.

Outra forma de resolver

Poderia-se usar um método set_celsius em vez de property, mas perderia a sintaxe de atributo. A property é mais idiomática.

Saída esperada

25.0
Erro: Temperatura abaixo do zero absoluto