Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

[Dúvida] Erro no Output após a adoção do Property e _

Boa tarde, fiz as alterações na aula de Property e coloquei o _ no self.ativo para proteger o atributo e não alterá-lo manualmente, entretanto quando eu executo aparece o seguinte erro abaixo:

Nome do restaurante       | Categoria                 | Status
Traceback (most recent call last):
  File "c:\PythonProjects\SaborExpressOO\modelos\restaurante.py", line 22, in <module>
    Restaurante.listar_restaurantes()
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^
  File "c:\PythonProjects\SaborExpressOO\modelos\restaurante.py", line 14, in listar_restaurantes
    print(f"{restaurante.nome.ljust(25)} | {restaurante.categoria.ljust(25)} | {restaurante.ativo}")
                                                                                ^^^^^^^^^^^^^^^^^
AttributeError: 'Restaurante' object has no attribute 'ativo'

Segue o código abaixo para verificação:

class Restaurante:
    restaurantes=[]
    def __init__(self,nome,categoria):
        self.nome=nome
        self.categoria=categoria
        self._ativo=False
        Restaurante.restaurantes.append(self)
    #Apredendo o método __str__
    def __str__(self):
        return f'{self.nome} | {self.categoria}'
    def listar_restaurantes():
        print(f'{'Nome do restaurante'.ljust(25)} | {'Categoria'.ljust(25)} | {'Status'}')
        for restaurante in Restaurante.restaurantes:
            print(f"{restaurante.nome.ljust(25)} | {restaurante.categoria.ljust(25)} | {restaurante.ativo}")

@property
def ativo(self):
    return '✅' if self._ativo else '❌'
restaurante_praca= Restaurante("Praça","Gourmet")
restaurante_pizza= Restaurante("Pizza Express","Italiana")

Restaurante.listar_restaurantes()

Alguém pode me ajudar?

2 respostas
solução!

Olá Gustavo, Espero que esteja bem!

O erro acontece porque ativo não está dentro da classe Restaurante, então os objetos dela não reconhecem esse atributo como uma propriedade.

Para corrigir, o decorador @property deve estar dentro da classe, garantindo que ativo seja acessado corretamente.

#------------Aqui começa a classe------------#
class Restaurante:
    restaurantes=[]
    def __init__(self,nome,categoria):
        self.nome=nome
        self.categoria=categoria
        self._ativo=False
        Restaurante.restaurantes.append(self)
    #Apredendo o método __str__
    def __str__(self):
        return f'{self.nome} | {self.categoria}'
    def listar_restaurantes():
        print(f'{'Nome do restaurante'.ljust(25)} | {'Categoria'.ljust(25)} | {'Status'}')
        for restaurante in Restaurante.restaurantes:
            print(f"{restaurante.nome.ljust(25)} | {restaurante.categoria.ljust(25)} | {restaurante.ativo}")

    @property
    def ativo(self):
        return '✅' if self._ativo else '❌'
        
#------------Aqui termina a classe------------#

restaurante_praca= Restaurante("Praça","Gourmet")
restaurante_pizza= Restaurante("Pizza Express","Italiana")

Restaurante.listar_restaurantes()

Muito obrigado pela ajuda Shayne!