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

[Dúvida] Existe uma maneira melhor de alterar o construtor para que ativo passe a ser False por padrão?

Olá pessoal,
Tenho a dúvida abaixo referente à questão 3. Minha solução atual cria uma nova classe RestauranteInativo que já vem com ativo=False por padrão:

class RestauranteInativo:
    def __init__(self, nome='', estilo='', preço='', chef='', ideal_para='', estrela_michelin=0, ativo=False):
        self.nome = nome
        self.estilo = estilo
        self.preço = preço
        self.chef = chef
        self.ideal_para = ideal_para
        self.estrela_michelin = estrela_michelin
        self.ativo = ativo

restaurante_Newyork = RestauranteInativo('Eleven Madison Park', 'Vegana, Inovativa', '$$$$', 'Daniel Humm', 'Um clássico', 3)
print(vars(restaurante_Newyork))

Funciona, mas o enunciado sugeria modificar a classe Restaurante existente em vez de criar uma nova. Pergunto: qual a forma correta/mais adequada de alterar o construtor para que ativo venha False por padrão, sem criar uma nova classe?

Agradeço sugestões e, se possível, um exemplo breve para cada alternativa.

2 respostas
solução!

Bom dia!

Yuri, o ideal é realmente alterar o construtor da classe Restaurante existente, e não criar uma nova classe. Dessa forma, todos os objetos criados a partir dela herdarão o comportamento padrão que você quer.

No Python, para definir um valor padrão para um atributo no construtor (__init__), basta atribuí-lo no parâmetro. Assim, se o valor não for informado na criação do objeto, ele usará o padrão definido.

class Restaurante:
    def __init__(self, nome='', estilo='', preco='', chef='', ideal_para='', estrela_michelin=0, ativo=False):
        self.nome = nome
        self.estilo = estilo
        self.preco = preco
        self.chef = chef
        self.ideal_para = ideal_para
        self.estrela_michelin = estrela_michelin
        self.ativo = ativo

Agora, sempre que você criar um restaurante sem especificar o parâmetro ativo, ele será automaticamente False:

restaurante_novo = Restaurante('Eleven Madison Park', 'Vegana, Inovativa', '$$$$', 'Daniel Humm', 'Um clássico', 3)
print(restaurante_novo.ativo)  # False

Se quiser criar um restaurante já ativo, basta informar o valor:

restaurante_aberto = Restaurante('Dom', 'Brasileira', '$$$$', 'Alex Atala', 'Alta gastronomia', 2, True)
print(restaurante_aberto.ativo)  # True

Alternativa mais explícita (útil quando se quer deixar o construtor mais legível):

class Restaurante:
    def __init__(self, nome='', estilo='', preco='', chef='', ideal_para='', estrela_michelin=0, ativo=None):
        self.nome = nome
        self.estilo = estilo
        self.preco = preco
        self.chef = chef
        self.ideal_para = ideal_para
        self.estrela_michelin = estrela_michelin
        self.ativo = False if ativo is None else ativo

Essa segunda forma é útil se, futuramente, você quiser ter alguma lógica de inicialização mais complexa.
Mas, para o caso apresentado no curso, a primeira opção é a mais simples e correta.

Olá! Muito obrigado pela resposta, foi extremamente clara e didática.

Sua explicação resolveu minha dúvida perfeitamente. A primeira solução, definindo ativo=False diretamente no parâmetro do __init__, é exatamente a abordagem simples e direta que eu estava procurando para seguir o enunciado da atividade. Faz todo o sentido que este seja o padrão, já que não preciso de nenhuma lógica complexa por trás.

Contudo a segunda alternativa que você apresentou, com ativo=None. É uma ótima "carta na manga" para ter em mente para situações futuras onde a inicialização de um atributo possa ter mais de uma condição. Você treinar mais o uso do "None" focando em um código mais legível e profissional.

Ajudou demais a consolidar o conceito.

Valeu pela ajuda!