1
resposta

[Dúvida] Duvida Exercício 5 - 07 Hora da prática: métodos especiais e atributos

Abaixo estão minhas resoluções. Entretanto no exercício 5 está aparecendo o TypeError: Cliente.listar_clientes() missing 1 required positional argument: 'self'. Não consegui identificar e eliminar este erro.

print('\nHora da prática: métodos especiais e atributos\nMinha resolução dos esxercícios:\n') 
print('\n1. 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.\n')
class Carro:
    carros=[]
    def __init__(self, modelo: str='', cor: str="", ano: int=0):
        self.modelo = modelo
        self.cor=cor
        self.ano=ano
        Carro.carros.append(self)    

    def __str__(self):
        return f'{self.modelo} | {self.cor} | {self.ano}'
    
    def listar_carro():
        for carro in Carro.carros:
            print(carro)

carro_Ford = Carro('Focus','prata', 2009)
carro_Toyota = Carro('Etios','branco', 2013)
carro_Honda = Carro('Fit','branco', 2020)

Carro.listar_carro()

print('\n2. 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.\n3. 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.\n4. 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.\n')

class Restaurante:
    restaurantes=[]

    def __init__(objeto, nome: str='', categoria: str='', endereco: str='', telefone: int=0, ativo: bool=False):
        objeto.nome = nome
        objeto.categoria = categoria
        objeto.endereco = endereco
        objeto.telefone = telefone
        objeto.ativo = False
        Restaurante.restaurantes.append(objeto)
    def __str__(objeto):
        return f'{objeto.nome} | {objeto.categoria} | {objeto.endereco} | {objeto.telefone} | {objeto.ativo}' 
    
    def listar_restaurantes():
        for restaurante in Restaurante.restaurantes:
            print(f'{restaurante.nome} | {restaurante.categoria} |{restaurante.endereco} | {restaurante.telefone} | {restaurante.ativo}')

restaurante_barroca = Restaurante('Barroca', 'Pizzaria', 'Rua Rio Negro, 100, Prado', '31 34565656', False) 
restaurante_prado = Restaurante('Prado','Restaurante', 'Rua Cuiabá, 156, Prado', '31 34566464', False)

Restaurante.listar_restaurantes()

print('\n5. 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.\n')

class Cliente:
    clientes=[]
    def __init__(self, nome: str='', CPF: int=0, email: str='', telefone: int=0):
        self.nome = nome
        self.CPF= CPF
        self.email= email
        self.telefone=telefone
        Cliente.clientes.append(self)
    
    def __str__(self):
        return f'{self.nome} | {self.CPF} | {self.email} | {self.telefone}'

    def listar_clientes(self):
        print(f'{self.nome} | {self.CPF} | {self.email} | {self.telefone}')

cliente1=Cliente('João da Silva',56874598745,'joao.silva@python.com',31985745415)
cliente2=Cliente('Jose da Silva',56874598746,'jose.silva@python.com',32985745415)
cliente1=Cliente('Joaquim da Silva',56874598747,'joaquim.silva@python.com',33985745415)

Cliente.listar_clientes()
1 resposta

Bom dia!

O problema no seu código está relacionado com a função listar_carros, o python não sabe a que a função se refere, pra que ela funcione corretamente você pode usar o decorator @staticmethod para que ele possa ser chamado diretamente na classe, sem precisar criar uma instância dela

print('\nHora da prática: métodos especiais e atributos\nMinha resolução dos esxercícios:\n') 
print('\n1. 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.\n')
class Carro:
    carros=[]
    def __init__(self, modelo: str='', cor: str="", ano: int=0):
        self.modelo = modelo
        self.cor=cor
        self.ano=ano
        Carro.carros.append(self)    

    def __str__(self):
        return f'{self.modelo} | {self.cor} | {self.ano}'
    
    // com isso o método listar_carro pode ser chamado diretamente pela classe 
    @staticmethod
    def listar_carro():
        for carro in Carro.carros:
            print(carro)

carro_Ford = Carro('Focus','prata', 2009)
carro_Toyota = Carro('Etios','branco', 2013)
carro_Honda = Carro('Fit','branco', 2020)

Carro.listar_carro()

print('\n2. 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.\n3. 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.\n4. 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.\n')

class Restaurante:
    restaurantes=[]

    def __init__(objeto, nome: str='', categoria: str='', endereco: str='', telefone: int=0, ativo: bool=False):
        objeto.nome = nome
        objeto.categoria = categoria
        objeto.endereco = endereco
        objeto.telefone = telefone
        objeto.ativo = False
        Restaurante.restaurantes.append(objeto)
    def __str__(objeto):
        return f'{objeto.nome} | {objeto.categoria} | {objeto.endereco} | {objeto.telefone} | {objeto.ativo}' 
    
    @staticmethod
    def listar_restaurantes():
        for restaurante in Restaurante.restaurantes:
            print(f'{restaurante.nome} | {restaurante.categoria} |{restaurante.endereco} | {restaurante.telefone} | {restaurante.ativo}')

restaurante_barroca = Restaurante('Barroca', 'Pizzaria', 'Rua Rio Negro, 100, Prado', '31 34565656', False) 
restaurante_prado = Restaurante('Prado','Restaurante', 'Rua Cuiabá, 156, Prado', '31 34566464', False)

Restaurante.listar_restaurantes()

print('\n5. 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.\n')

class Cliente:
    clientes=[]
    def __init__(self, nome: str='', CPF: int=0, email: str='', telefone: int=0):
        self.nome = nome
        self.CPF= CPF
        self.email= email
        self.telefone=telefone
        Cliente.clientes.append(self)
    
    def __str__(self):
        return f'{self.nome} | {self.CPF} | {self.email} | {self.telefone}'
    
    // corrigindo o método listar_clientes para listar todos os clientes da lista
    @staticmethod
    def listar_clientes():
        for cliente in clientes?
            print(f'Nome: {cliente.nome} | Email: {cliente.email}')

cliente1=Cliente('João da Silva',56874598745,'joao.silva@python.com',31985745415)
cliente2=Cliente('Jose da Silva',56874598746,'jose.silva@python.com',32985745415)
cliente1=Cliente('Joaquim da Silva',56874598747,'joaquim.silva@python.com',33985745415)

Cliente.listar_clientes()