1
resposta

[Bug] 07 Hora da prática: métodos especiais e atributos

A resposta 2e 3 dada na resposta do instrutor está errada:

  1. Em Python, não é permitido colocar um parâmetro com valor padrão antes de parâmetros que não têm valor padrão.
    def init(self, nome, categoria, ativo=False, capacidade, nota_avaliacao):

    isso dá erro:
    def init(self, nome, categoria, ativo=False, capacidade, nota_avaliacao):
    ^^^^^^^^^^

SyntaxError: parameter without a default follows parameter with a default

  1. Além da resposta 3 apresentar o mesmo erro anterior, ainda foi implementada de maneira erra, pois supostamente o enunciando pede a implementação de 2 parâmetros obrigatórios no construtor, porém foram colocado 4 parâmetros obrigatórios no construtor e 1 opcional.

    inclusive a implementação sugerida levanta erro:
    novo_restaurante = Restaurante(nome="Santa Marmita", categoria="Fast Food")
    TypeError: Restaurante.init() missing 2 required positional arguments: 'capacidade' and 'nota_avaliacao'

# 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.

class Restaurante:
    def __init__(self, nome, categoria, ativo=False, capacidade, nota_avaliacao):
        self.nome = nome
        self.categoria = categoria
        self.ativo = ativo
        self.capacidade = capacidade
        self.nota_avaliacao = nota_avaliacao

# Instanciando um restaurante e atribuindo valores aos seus atributos
restaurante_exemplo = Restaurante(nome='Comida Boa', categoria='Gourmet', ativo=True, capacidade=50, nota_avaliacao=4.5)

# 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.

class Restaurante:
    def __init__(self, nome, categoria, ativo=False, capacidade, nota_avaliacao):
        self.nome = nome
        self.categoria = categoria
        self.ativo = ativo
        self.capacidade = capacidade
        self.nota_avaliacao = nota_avaliacao

# Instanciando um restaurante utilizando o construtor
novo_restaurante = Restaurante(nome='Santa Marmita', categoria='Fast Food')

Minhas respostas:

# 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 Car:
    def __init__(self, model: str, color: str, year: int):
        self.model = model
        self.color = color
        self.year = year

    def __str__(self):
        return f"Model: {self.model} | color: {self.color} | year {self.year}"


corsa = Car("Corsa", "read", 2009)
print(corsa)


# 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.


class Restaurant:
    def __init__(self, name: str, category: str, stars: int, city: str, active=False):
        self.name = name
        self.category = category
        self.stars = stars
        self.city = city
        self.active = active


fazendinha = Restaurant(
    name="Fazendinha",
    category="Comida Mineira",
    stars=4,
    city="Serra do Cipó",
    active=True,
)
print(fazendinha.name)
print(fazendinha.city)
print(fazendinha.active)

# 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.
# 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.


class Restaurant:
    def __init__(self, name: str, category: str):
        self.name = name
        self.category = category
        self.active = False

    def __str__(self):
        return f"Restaurant: {self.name} | Category: {self.category}"


italianinho = Restaurant(name="Italianinho", category="Italian Food")

print(italianinho)

# 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.


class Client:
    def __init__(self, name: str, age: int, city: str, phone: str):
        self.name = name
        self.age = age
        self.city = city
        self.phone = phone

    def __str__(self):
        return f"Client: {self.name}, age: {self.age}, city: {self.city}, phone: {self.phone}"


leonardo = Client("Leonardo Siqueira", 33, "Juatuba", "9999-9999")
lindalva = Client("Lindalva Souza", 55, "Sorocaba", "8888-8888")
mario = Client("Mario Santos", 27, "Santos", "7777-7777")

print(leonardo)
print(lindalva)
print(mario)
1 resposta

Oi, Thaís! Tudo bem?

Você está certíssima nas observações.

Em Python realmente não é permitido colocar um parâmetro com valor padrão antes de parâmetros obrigatórios. Por isso o construtor sugerido no exemplo acaba gerando o erro:

SyntaxError: parameter without a default follows parameter with a default

Para esse caso, a ordem correta seria colocar os opcionais por último, assim:

def __init__(self, nome, categoria, capacidade, nota_avaliacao, ativo=False):

Além disso, como você mencionou, o exercício 3 pede apenas dois parâmetros obrigatórios (nome e categoria) e os exemplos dados acabam exigindo mais argumentos do que deveria, causando o TypeError.

A sua resolução ficou super organizada e segue exatamente o que o enunciado pede, inclusive separando bem o caso com atributos extras e o construtor mais simples com ativo=False por padrão.

Obrigado por compartilhar! Ajuda bastante quem está fazendo o curso também.