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

[Dúvida] Praticando Construtor e métodos especiais

1 - Implemente uma classe chamada Carro com os atributos básicos, como modelo, cor e ano. Crie uma instância dessa classe e atribua valores aos seus atributos.

class Carros:
    lista_de_carros = []
    def __init__(self, modelo, cor, ano):
        self.modelo = modelo
        self.cor = cor
        self.ano = ano
        Carros.lista_de_carros.append(self)
    
    def listar_carros():
        for carro in Carros.lista_de_carros:
            print(f'{carro.modelo} | {carro.cor} | {carro.ano}')

carro_corola = Carros('Corola', 'Rosa choque', 2005)

Carros.listar_carros()

2 - Crie uma classe chamada Restaurante com os atributos nome, categoria, ativo e crie mais 2 atributos. Instancie um restaurante e atribua valores aos seus atributos.

Tem algo errado aqui mas não consegui identificar. Alguém poderia me explicar?

class Restaurantes:
    lista_de_restaurantes = []
    def __init__(self, nome, categoria, ativo=False, avaliaçoes, endereço):
        self.nome = nome
        self.categoria = categoria
        self.ativo = ativo
        self.avaliaçoes = avaliaçoes
        self.endereço = endereço
        Restaurantes.lista_de_restaurantes.append(self)

    def listar_restaurantes():
        for restaurante in Restaurantes.lista_de_restaurantes:
            print(f'{restaurante.nome} | {restaurante.categoria} | {restaurante.ativo} | {restaurante.avaliaçoes} | {restaurante.endereço}')

restaurante_mae_joana = Restaurantes('Casa da Mão Joana', 'Nordestina', ativo=True, 10, 'Salvador')

Restaurantes.listar_restaurantes()

3 - Modifique a classe Restaurante adicionando um construtor que aceita nome e categoria como parâmetros e inicia ativo como False por padrão. Crie uma instância utilizando o construtor.

O erro da etapa anterior segue para esta etapa.

class Restaurantes:
    lista_de_restaurantes = []
    def __init__(self, nome, categoria, ativo=False, avaliaçoes, endereço):
        self.nome = nome
        self.categoria = categoria
        self.ativo = ativo
        self.avaliaçoes = avaliaçoes
        self.endereço = endereço
        Restaurantes.lista_de_restaurantes.append(self)

    def listar_restaurantes():
        for restaurante in Restaurantes.lista_de_restaurantes:
            print(f'{restaurante.nome} | {restaurante.categoria} | {restaurante.ativo} | {restaurante.avaliaçoes} | {restaurante.endereço}')

restaurante_mae_joana = Restaurantes('Casa da Mão Joana', 'Nordestina', ativo=True, 10, 'Salvador')
restaurante_tempero_e_musica = Restaurantes('Tempero e Música', 'Bar')

Restaurantes.listar_restaurantes()

4 - Adicione um método especial str à classe Restaurante para que, ao imprimir uma instância, seja exibida uma mensagem formatada com o nome e a categoria. Exiba essa mensagem para uma instância de restaurante.

Mesma coisa

class Restaurantes:
    lista_de_restaurantes = []
    def __init__(self, nome, categoria, ativo=False, avaliaçoes, endereço):
        self.nome = nome
        self.categoria = categoria
        self.ativo = ativo
        self.avaliaçoes = avaliaçoes
        self.endereço = endereço
        Restaurantes.lista_de_restaurantes.append(self)

    def __str__(self) -> str:
        return f'{self.nome} | {self.categoria}'

    

restaurante_mae_joana = Restaurantes('Casa da Mão Joana', 'Nordestina', ativo=True, 10, 'Salvador')
restaurante_tempero_e_musica = Restaurantes('Tempero e Música', 'Bar')

print(restaurante_mae_joana)

5 - Crie uma classe chamada Cliente e pense em 4 atributos. Em seguida, instancie 3 objetos desta classe e atribua valores aos seus atributos através de um método construtor.

Esse ta tudo certo

class Cliente:
    lista_de_clientes = []
    def __init__(self, nome, idade, profissao, endereço):
        self.nome = nome
        self.idade = idade
        self.profissao = profissao
        self.endereço = endereço
        Cliente.lista_de_clientes.append(self)

    def __str__(self) -> str:
        return f'{self.nome} | {self.idade} | {self.profissao} | {self.endereço}'

cliente_Felipe = Cliente('Felipe', 28, 'Psicólogo', 'Fortaleza')

print(cliente_Felipe)
2 respostas
solução!

Quando você passa argumentos para um método você pode determinar valores padrões, que caso o usuário não preencha, o valor utilizado será o padrão pré-definido. É o que acontece com a classe restaurantes:

class Restaurantes:
    lista_de_restaurantes = []
    def __init__(self, nome, categoria, ativo=False):
        self.nome = nome
        self.categoria = categoria
        self.ativo = ativo
        self.avaliaçoes = avaliaçoes
        self.endereço = endereço
        Restaurantes.lista_de_restaurantes.append(self)

Ao criar um objeto da classe restaurante, se o parâmetro 'ativo' não for preenchido o objeto será criado com o valor padrão 'ativo=False', o mesmo não aconteceria para os demais parâmetros, que caso não sejam indicados na criação do objeto um erro seria retornado.

O problema do seu código foi que parâmetros com valores padrão devem ficar "por último" na declaração, então você deveria usar

def __init__(self, nome, categoria, avaliaçoes, endereço, ativo=False):

no lugar de

def __init__(self, nome, categoria, ativo=False, avaliaçoes, endereço):

Fique atento ainda que agora na criação de objetos a ordem dos argumentos foram alteradas, então deve substituir restaurante_mae_joana = Restaurantes('Casa da Mão Joana', 'Nordestina', ativo=True, 10, 'Salvador') por restaurante_mae_joana = Restaurantes('Casa da Mão Joana', 'Nordestina', 10, 'Salvador', ativo=True), ou somente restaurante_mae_joana = Restaurantes('Casa da Mão Joana', 'Nordestina', 10, 'Salvador', True).

O mesmo erro foi cometido nas demais classes.

Ahhhhh, entendi! Agora está funcionando direitinho. Obrigado, Nilo!