2
respostas

Estou estagnado no meu projeto

Olá!

No meio desse curso, acabei fazendo um projeto para melhor fixação. Mas, ao decorrer do curso, não fui compreendendo muito sobre o assunto e não sabendo aplicar no projeto.

Poderiam me dar uma sugestão ou uma dica para eu poder fluir com o projeto?

Segue projeto:

class Product:
produtos = []

def __init__(self, nome, preco, quantidade):
    self._nome = nome
    self._preco = preco
    self._quantidade = quantidade
    Product.produtos.append(self)


def __str__(self):
    return f'{self._nome} | {self._preco} | {self._quantidade}'


def adicionar_estoque(self, quantidade):
    if quantidade < 0:
        return 'Erro na quantidade'
    else:
        self._quantidade += quantidade
        return f'Estoque atualizado! Estoque atual: {self._quantidade}'


def remover_estoque(self, quantidade):
    if quantidade < 0:
        return 'Erro na quantidade'
    elif quantidade > self._quantidade:
        return 'Está acima do estoque.'
    else:
        self._quantidade -= quantidade
        return f'Quantidade removida! Estoque atualizado: {self._quantidade}'
    

def calculo_total(self):
    return self._quantidade * self._preco


def calcular_produtos(self, quantidade):
    return quantidade * self._preco

@classmethod
def listar_todos(cls):
    print(f'{'Nome'.ljust(25)} | {'Preço'.ljust(25)} | {'Quantidade'.ljust(25)}')
    for produto in cls.produtos:
        print(f'{produto._nome.ljust(25)} | R$ {str(produto._preco).ljust(25)} | {str(produto._quantidade).ljust(25)}')
    

@classmethod
def valor_total_estoque(cls):
    total = 0
    for produto in cls.produtos:
        total = total + produto.calculo_total()
    return total

@classmethod
def buscar_pelo_nome(cls, nome):
    for produto in cls.produtos:
        if produto._nome == nome: 
            return produto
    return None
        

from product import Product

class Stock:
def init(self):
self._produtos = []

def adicionar_produto(self, produto):
    for p in self._produtos:
        if p._nome == produto._nome:
            return 'Produto já no estoque'
    self._produtos.append(produto)
    return f'Produto adicionado ao estoque: {produto._nome.ljust(10)} | {str(produto._preco).ljust(10)} | {str(produto._quantidade).ljust(10)}'

def remover_produto(self, produto):
    for p in self._produtos:
        if p._nome == produto._nome:
            self._produtos.remove(p)
            return 'Produto removido'
    return 'Produto não encontrado'

def listar_produtos(self):
    for p in self._produtos:
        print(f'{p._nome.ljust(25)} | R$ {str(p._preco).ljust(25)} | {str(p._quantidade).ljust(25)}')

Garanta sua matrícula hoje e ganhe + 2 meses grátis

Continue sua jornada tech com ainda mais tempo para aprender e evoluir

Quero aproveitar agora
2 respostas

Ola Rafael.
Veja se o conteudo abaixo destrava seu projeto:
O projeto já tem uma estrutura básica com classes como Product e Stock, mas há alguns pontos que podem ser melhorados para que o código fique mais legível e organizado.
Voce criou métodos como adicionar_estoque e remover_estoque para manipular a quantidade de produtos, o que está correto, mas usa self._quantidade, que é uma boa prática para acesso a atributos privados.
No entanto, ao acessar diretamente os atributos privados de outras instâncias, como no método listar_todos, acaba fazendo algo que não é o mais recomendado em termos de encapsulamento.
Poderia criar métodos públicos que retornem informações, em vez de acessar diretamente os atributos.
O método adicionar_produto já realiza a verificação de duplicação de produtos no estoque.
Isso é ótimo! Porém, o método listar_produtos poderia também usar o método __str__ da classe Product, tornando o código mais modular e limpo.
Em vez de acessar os atributos diretamente (produto._nome), é melhor usar métodos getter e setter para garantir que o acesso seja feito de maneira controlada.
Isso melhora a manutenção do código no futuro.
Exemplo:

class Product:
    # ...

    def get_nome(self):
        return self._nome
    
    def set_nome(self, nome):
        self._nome = nome

No caso, você pode usar esses métodos dentro de outras classes, como a Stock, para manipular os dados dos produtos.
Como está aprendendo a consumir APIs, talvez uma parte importante do projeto seja integrar algum serviço de API para buscar informações, como o preço dos produtos ou informações sobre o estoque de algum fornecedor.
Usando a biblioteca requests de Python, ele poderia fazer chamadas a APIs externas.
Por exemplo, para buscar informações sobre um produto via API:

import requests

class Product:
    def buscar_info_api(self):
        url = f'https://api.exemplo.com/produtos/{self._nome}'
        response = requests.get(url)
        if response.status_code == 200:
            dados = response.json()
            self._preco = dados['preco']
            return f'Informações do produto {self._nome} atualizadas com sucesso!'
        else:
            return 'Erro ao buscar informações na API'

Vou sugerir uma refatoração para melhorar a organização e os pontos mencionados acima:

import requests

class Product:
    produtos = []

    def __init__(self, nome, preco, quantidade):
        self._nome = nome
        self._preco = preco
        self._quantidade = quantidade
        Product.produtos.append(self)

    def __str__(self):
        return f'{self._nome} | R$ {self._preco} | {self._quantidade}'

    def adicionar_estoque(self, quantidade):
        if quantidade < 0:
            return 'Erro na quantidade'
        self._quantidade += quantidade
        return f'Estoque atualizado! Estoque atual: {self._quantidade}'

    def remover_estoque(self, quantidade):
        if quantidade < 0:
            return 'Erro na quantidade'
        if quantidade > self._quantidade:
            return 'Quantidade insuficiente em estoque.'
        self._quantidade -= quantidade
        return f'Estoque atualizado! Estoque atual: {self._quantidade}'

    def calcular_valor_total(self):
        return self._quantidade * self._preco

    @classmethod
    def listar_todos(cls):
        print(f'{"Nome".ljust(25)} | {"Preço".ljust(25)} | {"Quantidade".ljust(25)}')
        for produto in cls.produtos:
            print(str(produto))

    @classmethod
    def buscar_por_nome(cls, nome):
        for produto in cls.produtos:
            if produto._nome.lower() == nome.lower():
                return produto
        return None

    def atualizar_info_api(self):
        url = f'https://api.exemplo.com/produto/{self._nome}'
        response = requests.get(url)
        if response.status_code == 200:
            dados = response.json()
            self._preco = dados['preco']
            return f'Preço atualizado via API: R$ {self._preco}'
        return 'Falha ao atualizar preço via API'

class Stock:
    def __init__(self):
        self._produtos = []

    def adicionar_produto(self, produto):
        if any(p._nome == produto._nome for p in self._produtos):
            return 'Produto já existe no estoque.'
        self._produtos.append(produto)
        return f'Produto {produto._nome} adicionado ao estoque.'

    def remover_produto(self, produto):
        if produto in self._produtos:
            self._produtos.remove(produto)
            return f'Produto {produto._nome} removido do estoque.'
        return 'Produto não encontrado.'

    def listar_produtos(self):
        if not self._produtos:
            return 'Nenhum produto no estoque.'
        for produto in self._produtos:
            print(produto)

continua...

Próximos Passos

  • Consumir API de Preço: pode usar a função atualizar_info_api para integrar a API e manter o preço dos produtos atualizado automaticamente.
  • Desenvolver um front-end simples (se necessário): Usando Flask ou FastAPI, pode criar uma API web simples para visualizar e manipular o estoque, praticando ainda mais com o consumo de APIs.
  • Testes e Validação: poderia escrever testes unitários (usando unittest ou pytest) para garantir que as funcionalidades estejam corretas, especialmente as que envolvem manipulação de estoque e cálculos de preços.
    Espero que essas dicas ajudem a seguir em frente com o projeto!
    Aguardo seu feedback.
    Bons estudos.