Olá, Fabio.
Tudo bem?
O @property
é um decorador em Python que permite que você trate métodos como se fossem atributos. Isso é útil quando você quer controlar o acesso a um atributo, permitindo a leitura, mas não a modificação direta, ou quando você quer que o valor do atributo seja calculado dinamicamente.
Analisando o seu exemplo, o método ativo
é decorado com @property
, o que significa que ele pode ser acessado como um atributo, mas seu valor é calculado dinamicamente com base no valor de _ativo
.
Quando você tenta fazer Restaurante.ativo = True
, você está tentando modificar diretamente o método ativo
, o que não é permitido porque ele não tem um setter definido. Para modificar o estado de _ativo
, você deve usar o método alternar_estado
:
restaurante_praca = Restaurante('Praça', 'Gourmet')
print(restaurante_praca.ativo) # ☐
restaurante_praca.alternar_estado()
print(restaurante_praca.ativo) # ⌧
Se você quiser permitir a modificação direta do atributo ativo
, você pode definir um setter para ele:
class Restaurante:
def __init__(self, nome, categoria):
self.nome = nome
self.categoria = categoria
self._ativo = False
@property
def ativo(self):
return '⌧' if self._ativo else '☐'
@ativo.setter
def ativo(self, valor):
self._ativo = valor
Agora, você pode fazer:
restaurante_praca = Restaurante('Praça', 'Gourmet')
restaurante_praca.ativo = True
print(restaurante_praca.ativo) # ⌧
Espero ter ajudado e bons estudos!