2
respostas

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

#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 Carro: lista_carro = []

def __init__(self, modelo: str, cor: str, ano: int):
    # Validações básicas
    if not isinstance(modelo, str) or not modelo:
        raise ValueError("O modelo deve ser uma string não vazia.")
    if not isinstance(cor, str) or not cor:
        raise ValueError("A cor deve ser uma string não vazia.")
    if not isinstance(ano, int) or ano <= 1885:  # O ano não pode ser anterior à invenção do carro
        raise ValueError("Ano inválido.")
    
    self.modelo = modelo
    self.cor = cor
    self.ano = ano
    Carro.lista_carro.append(self)

def __str__(self):
    return f'Modelo: {self.modelo.ljust(20)} | Cor: {self.cor.ljust(15)} | Ano: {str(self.ano).ljust(4)}'

@staticmethod
def listar_carros():
    '''Exibe o índice e todas as informações dos carros cadastrados'''
    if not Carro.lista_carro:
        print("Nenhum carro cadastrado.")
    else:
        for indice, carro in enumerate(Carro.lista_carro, start=1):  # Começa do 1 para facilitar a leitura
            print(f'{indice}. {carro}')

#Instanciando carros carro_ferrari = Carro('Ferrari', 'Amarelo', 2012) carro_tesla = Carro('Tesla Model S', 'Preto', 2020)

#Listando carros cadastrados Carro.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.

class Restaurante:

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

def __init__(self, nome: str, categoria: str, cidade: str, bairro: str, ativo: bool = False):

    self.nome = nome
    self.categoria = categoria
    self.cidade = cidade
    self.bairro = bairro
    self.ativo = ativo
    Restaurante.lista_restaurantes.append(self)

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

def __str__(self):
    return f'Nome : {self.nome.ljust(10)} | Categoria: {self.categoria.ljust(10)} | Cidade: {self.cidade.ljust(10)} | Bairro: {self.bairro.ljust(10)} | Ativo: {self.ativo}'

def ativar(self):
    self.ativo = True  # Altera o valor de ativo para True

def desativar(self):
    self.ativo = False  # Altera o valor de ativo para False

@staticmethod
def listar_restaurantes():
    for indice, restaurante in enumerate(Restaurante.lista_restaurantes, start=1):
        print(f'- {indice}.{restaurante}')

restaurante_matsu = Restaurante('Matsu', 'Japonesa', 'São Paulo', 'Tatuape', True) restaurante_alibabo = Restaurante('Alibabo', 'Arabi', 'São Paulo', 'Belém')

#For Debug #print(type(restaurante_alibabo))

Restaurante.listar_restaurantes()

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

class Cliente:

lista_de_clientes = []
def __init__(self, nome: str, nacionalidade: str, empresa: str, bairro: str):
    if not isinstance(nome, str) or not nome:
        print('O nome deve ser uma string não vazia.')
    if not isinstance(nacionalidade, str) or not nacionalidade:
        print('A nacionalidade deve ser uma string não vazia.')
    if not isinstance(empresa, str) or not empresa:
        print('A empresa deve ser uma string não vazia.')
    if not isinstance(bairro, str) or not bairro:
        print('O bairro deve ser uma string não vazia.')

    self.nome = nome
    self.nacionalidade = nacionalidade
    self.empresa = empresa
    self.bairro = bairro
    Cliente.lista_de_clientes.append(self)

def __str__(self):
    return f'Nome: {self.nome.ljust(15)} | Nacionalidade: {self.nacionalidade.ljust(10)} | self.Empresa: {self.empresa.ljust(10)} | Bairro: {self.bairro}'

@staticmethod
def listar_clientes():
    for indice, cliente in enumerate(Cliente.lista_de_clientes, start=1):
        print(f'{indice}. {cliente}')

cliente1 = Cliente('Machado', 'Brasileira', 'Winner Levels', 'Analia Franco') cliente2 = Cliente('Martelo', 'Colombiana', 'Maricas', 'Cartajena')

Cliente.listar_clientes()

2 respostas

Complementando o código acima, não coube tudo:

def __init__(self, nome: str, nacionalidade: str, empresa: str, bairro: str):
    if not isinstance(nome, str) or not nome:
        print('O nome deve ser uma string não vazia.')
    if not isinstance(nacionalidade, str) or not nacionalidade:
        print('A nacionalidade deve ser uma string não vazia.')
    if not isinstance(empresa, str) or not empresa:
        print('A empresa deve ser uma string não vazia.')
    if not isinstance(bairro, str) or not bairro:
        print('O bairro deve ser uma string não vazia.')

    self.nome = nome
    self.nacionalidade = nacionalidade
    self.empresa = empresa
    self.bairro = bairro
    Cliente.lista_de_clientes.append(self)

Oi, Marcos! Como vai?

Ficou muito bom como você estruturou as classes e separou responsabilidades em cada uma. Chamou atenção o uso de validações nos construtores e o uso consistente do __str__ para tornar a visualização mais legível, isso ajuda bastante no teste e depuração.

Uma dica interessante para o futuro é usar __repr__ quando quiser uma saída mais técnica ou útil para debug, além do __str__.



class Carro:
    def __repr__(self):
        return f'Carro(modelo="{self.modelo}", cor="{self.cor}", ano={self.ano})'

Esse método retorna uma string que representa a instância como código, útil quando você imprime listas de objetos diretamente no terminal.

Conteúdos relacionados
Alura

Conte com o apoio da comunidade Alura na sua jornada. Abraços e bons estudos!