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
celsiususando@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
- Definimos a classe
Temperaturacom um construtor que recebecelsiuse atribui aself.celsius. Isso aciona o setter, garantindo a validação desde a criação. - O getter
celsiusé decorado com@propertye simplesmente retornaself._celsius, o atributo interno que guarda o valor. - O setter é definido com
@celsius.setter. Ele verifica se o valor é menor que -273.15 e, se for, lançaValueErrorcom a mensagem especificada. - Se o valor for válido, armazena em
self._celsius. O uso do underscore evita conflito com o nome da property. - No teste, criamos uma instância com 25 e imprimimos
t.celsius, que chama o getter e exibe 25.0. - Tentamos atribuir -300, o que dispara o setter, lança
ValueErrore 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 usarself.celsius = valordentro do setter, ocorre recursão infinita porque o setter chama a si mesmo. Useself._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 fizerself._celsius = celsiusdiretamente, a validação não ocorre na criação. Prefiraself.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