Definir uma Classe Simples

Beginner

This tutorial is from open-source community. Access the source code

Introdução

Neste laboratório, você aprenderá a aprimorar uma classe Stock projetada para representar participações acionárias. Você adicionará novos métodos e funcionalidades a esta classe, tornando-a mais versátil e útil.

Os objetivos deste laboratório incluem adicionar um método sell à classe Stock existente, criar uma função para ler dados de carteira de ações de um arquivo CSV e outra função para exibir os dados da carteira em uma tabela formatada. O arquivo a ser modificado é stock.py.

Este é um Lab Guiado, que fornece instruções passo a passo para ajudá-lo a aprender e praticar. Siga as instruções cuidadosamente para completar cada etapa e ganhar experiência prática. Dados históricos mostram que este é um laboratório de nível iniciante com uma taxa de conclusão de 97%. Recebeu uma taxa de avaliações positivas de 100% dos estudantes.

Adicionando um Método sell à Classe Stock

Nesta etapa, vamos aprimorar a classe Stock adicionando um novo método. Um método é como uma função especial que pertence a uma classe e pode trabalhar com os objetos criados a partir dessa classe. Criaremos um método chamado sell(nshares) que nos ajudará a simular a ação de vender ações de uma ação. Quando você vende ações, o número de ações que você possui diminui, e este método lidará com essa redução para nós.

O que é um Método?

Vamos primeiro entender o que é um método. Um método é uma função que é definida dentro de uma classe. Ele é projetado para operar em instâncias (que são como cópias individuais) dessa classe. Quando um método é chamado em um objeto, ele pode acessar todos os atributos (características) desse objeto. Ele faz isso através do parâmetro self. O parâmetro self é uma referência ao objeto no qual o método está sendo chamado. Portanto, quando você usa self dentro de um método, você está se referindo ao objeto específico em que o método está atuando.

Instruções de Implementação

  1. Primeiro, precisamos abrir o arquivo stock.py no editor. Para fazer isso, usaremos a linha de comando. Abra seu terminal e execute o seguinte comando. Este comando altera o diretório para a pasta project onde o arquivo stock.py está localizado.
cd ~/project
  1. Depois de abrir o arquivo stock.py, você precisa encontrar um comentário específico na classe Stock. Procure o comentário ## TODO: Add sell(nshares) method here. Este comentário é um espaço reservado que indica onde devemos adicionar nosso novo método sell.

  2. Agora, é hora de adicionar o método sell. Este método receberá um parâmetro chamado nshares, que representa o número de ações que você deseja vender. O trabalho principal deste método é diminuir o atributo shares do objeto Stock pelo número de ações que você está vendendo.

Aqui está o código para o método sell que você precisa adicionar:

def sell(self, nshares):
    self.shares -= nshares

Neste código, self.shares se refere ao atributo shares do objeto Stock. O operador -= subtrai o valor de nshares do valor atual de self.shares.

  1. Depois de adicionar o método sell, você precisa salvar o arquivo stock.py. Você pode fazer isso pressionando Ctrl+S no seu teclado ou selecionando "File > Save" no menu do seu editor.

  2. Para garantir que nosso método sell funcione corretamente, criaremos um script de teste. Crie um novo arquivo Python chamado test_sell.py e adicione o seguinte código a ele:

## test_sell.py
from stock import Stock

## Create a stock object
s = Stock('GOOG', 100, 490.10)
print(f"Initial shares: {s.shares}")

## Sell 25 shares
s.sell(25)
print(f"Shares after selling: {s.shares}")

Neste script, primeiro importamos a classe Stock do arquivo stock.py. Em seguida, criamos um objeto Stock chamado s com o símbolo da ação GOOG, 100 ações e um preço de 490.10. Imprimimos o número inicial de ações. Depois disso, chamamos o método sell no objeto s para vender 25 ações. Finalmente, imprimimos o número de ações após a venda.

  1. Agora, executaremos o script de teste para ver se nosso método sell está funcionando como esperado. Abra seu terminal novamente e execute o seguinte comando:
python3 test_sell.py

Se tudo estiver funcionando corretamente, você deverá ver uma saída semelhante a esta:

Initial shares: 100
Shares after selling: 75

Esta saída confirma que nosso método sell está funcionando corretamente. Ele reduziu com sucesso o número de ações pela quantidade que especificamos.

Lendo uma Carteira de um Arquivo CSV

Nesta etapa, vamos criar uma função que lê dados de ações de um arquivo CSV e retorna uma lista de objetos Stock. Um objeto Stock representa uma participação acionária e, ao final desta etapa, você poderá ler uma carteira de ações de um arquivo CSV.

Entendendo Arquivos CSV

CSV, que significa Valores Separados por Vírgula (Comma-Separated Values), é um formato muito comum para armazenar dados tabulares. Pense nisso como uma planilha simples. Cada linha em um arquivo CSV representa uma linha de dados, e as colunas dentro dessa linha são separadas por vírgulas. Normalmente, a primeira linha de um arquivo CSV contém cabeçalhos. Esses cabeçalhos descrevem que tipo de dados está em cada coluna. Por exemplo, em um CSV de carteira de ações, os cabeçalhos podem ser "Nome", "Ações" e "Preço".

Instruções de Implementação

  1. Primeiro, abra o arquivo stock.py no seu editor de código. Se já estiver aberto, ótimo! Caso contrário, encontre-o e abra-o. É aqui que adicionaremos nossa nova função.

  2. Depois que o arquivo stock.py estiver aberto, procure o comentário ## TODO: Add read_portfolio(filename) function here. Este comentário é um espaço reservado que nos diz onde colocar nossa nova função.

  3. Abaixo desse comentário, adicione a seguinte função. Esta função é chamada read_portfolio e recebe um nome de arquivo como argumento. O objetivo desta função é ler o arquivo CSV, extrair os dados das ações e criar uma lista de objetos Stock.

def read_portfolio(filename):
    """
    Read a CSV file containing portfolio data and return a list of Stock objects.

    Args:
        filename (str): Path to the CSV file

    Returns:
        list: A list of Stock objects
    """
    portfolio = []

    with open(filename, 'r') as f:
        headers = next(f).strip().split(',')  ## Skip the header line

        for line in f:
            row = line.strip().split(',')
            name = row[0]
            shares = int(row[1])
            price = float(row[2])

            ## Create a Stock object and add it to the portfolio list
            stock = Stock(name, shares, price)
            portfolio.append(stock)

    return portfolio

Vamos detalhar o que essa função faz. Primeiro, ela cria uma lista vazia chamada portfolio. Em seguida, ela abre o arquivo CSV no modo de leitura. A instrução next(f) pula a primeira linha, que é a linha do cabeçalho. Depois disso, ela percorre cada linha do arquivo. Para cada linha, ela divide a linha em uma lista de valores, extrai o nome, o número de ações e o preço, cria um objeto Stock e o adiciona à lista portfolio. Finalmente, ela retorna a lista portfolio.

  1. Depois de adicionar a função, salve o arquivo stock.py. Você pode fazer isso pressionando Ctrl+S no seu teclado ou selecionando "File > Save" no menu do seu editor de código. Salvar o arquivo garante que suas alterações sejam preservadas.

  2. Agora, precisamos testar nossa função read_portfolio. Crie um novo script Python chamado test_portfolio.py. Este script importará a função read_portfolio do arquivo stock.py, lerá a carteira de um arquivo CSV e imprimirá informações sobre cada ação na carteira.

## test_portfolio.py
from stock import read_portfolio

## Read the portfolio from the CSV file
portfolio = read_portfolio('portfolio.csv')

## Print information about each stock
for stock in portfolio:
    print(f"Name: {stock.name}, Shares: {stock.shares}, Price: ${stock.price:.2f}")

## Print the total number of stocks in the portfolio
print(f"\nTotal number of stocks in portfolio: {len(portfolio)}")

Neste script, primeiro importamos a função read_portfolio. Em seguida, chamamos a função com o nome do arquivo portfolio.csv para obter a lista de objetos Stock. Depois disso, percorremos a lista e imprimimos informações sobre cada ação. Finalmente, imprimimos o número total de ações na carteira.

  1. Para executar o script de teste, abra seu terminal ou prompt de comando, navegue até o diretório onde o arquivo test_portfolio.py está localizado e execute o seguinte comando:
python3 test_portfolio.py

Se tudo estiver funcionando corretamente, você deverá ver uma saída que lista todas as ações do arquivo portfolio.csv, juntamente com seus nomes, número de ações e preços. Você também deverá ver o número total de ações na carteira.

Name: AA, Shares: 100, Price: $32.20
Name: IBM, Shares: 50, Price: $91.10
Name: CAT, Shares: 150, Price: $83.44
Name: MSFT, Shares: 200, Price: $51.23
Name: GE, Shares: 95, Price: $40.37
Name: MSFT, Shares: 50, Price: $65.10
Name: IBM, Shares: 100, Price: $70.44

Total number of stocks in portfolio: 7

Esta saída confirma que sua função read_portfolio está lendo corretamente o arquivo CSV e criando objetos Stock a partir de seus dados.

Formatação e Impressão dos Dados da Carteira

Nesta etapa, vamos criar uma função que nos ajudará a exibir os dados da carteira em uma tabela bem organizada. Uma carteira é uma coleção de ações, e é importante apresentar esses dados de forma clara e legível. É aí que a função print_portfolio(portfolio) entra em ação. Esta função receberá uma carteira como entrada e a exibirá em uma tabela com cabeçalhos e alinhamento adequado.

Formatação de Strings em Python

Em Python, existem várias maneiras de formatar strings. A formatação de strings é uma habilidade crucial, pois permite que você apresente dados de maneira mais organizada e amigável ao usuário.

  • O operador % é um estilo mais antigo de formatação de strings. É como um modelo onde você pode inserir valores em locais específicos em uma string.
  • O método str.format() é outra maneira. Ele oferece mais flexibilidade e uma sintaxe mais limpa para formatar strings.
  • f-strings são um recurso introduzido no Python 3.6 e posterior. Eles são muito convenientes, pois permitem que você incorpore expressões dentro de literais de string.

Para este exercício, usaremos o operador %. Ele é particularmente útil quando você deseja criar colunas de largura fixa, que é exatamente o que precisamos para nossa tabela de carteira.

Instruções de Implementação

  1. Primeiro, abra o arquivo stock.py no seu editor. Se já estiver aberto, ótimo. Este arquivo é onde escreveremos nossa função print_portfolio.

  2. Depois que o arquivo estiver aberto, procure o comentário ## TODO: Add print_portfolio(portfolio) function here. Este comentário é um marcador que nos diz onde adicionar nossa nova função.

  3. Abaixo desse comentário, adicione a seguinte função:

def print_portfolio(portfolio):
    """
    Print the portfolio data in a nicely formatted table.

    Args:
        portfolio (list): A list of Stock objects
    """
    ## Print the header row
    print('%10s %10s %10s' % ('name', 'shares', 'price'))

    ## Print a separator line
    print('-' * 10 + ' ' + '-' * 10 + ' ' + '-' * 10)

    ## Print each stock in the portfolio
    for stock in portfolio:
        print('%10s %10d %10.2f' % (stock.name, stock.shares, stock.price))

Esta função primeiro imprime a linha de cabeçalho da tabela, depois uma linha separadora e, finalmente, percorre cada ação na carteira e imprime seus detalhes de forma formatada.

  1. Depois de adicionar a função, salve o arquivo. Você pode fazer isso pressionando Ctrl+S ou selecionando "File > Save" no menu. Salvar o arquivo garante que suas alterações sejam preservadas.

  2. Agora, precisamos testar nossa função. Crie um novo arquivo chamado test_print.py. Este arquivo será nosso script de teste. Adicione o seguinte código a ele:

## test_print.py
from stock import read_portfolio, print_portfolio

## Read the portfolio from the CSV file
portfolio = read_portfolio('portfolio.csv')

## Print the portfolio as a formatted table
print_portfolio(portfolio)

Este script importa as funções read_portfolio e print_portfolio do arquivo stock.py. Em seguida, ele lê os dados da carteira de um arquivo CSV e usa nossa função print_portfolio recém-criada para exibi-los.

  1. Finalmente, execute o script de teste. Abra seu terminal e digite o seguinte comando:
python3 test_print.py

Se tudo estiver funcionando corretamente, você deverá ver uma saída como esta:

      name     shares      price
---------- ---------- ----------
        AA        100      32.20
       IBM         50      91.10
       CAT        150      83.44
      MSFT        200      51.23
        GE         95      40.37
      MSFT         50      65.10
       IBM        100      70.44

Esta saída confirma que sua função print_portfolio está funcionando conforme o esperado. Ela formata e exibe os dados da carteira em uma tabela com cabeçalhos e colunas alinhadas, tornando-a fácil de ler.

Entendendo a Formatação de Strings

Vamos analisar mais de perto como a formatação de strings funciona na função print_portfolio.

  • %10s é usado para formatar uma string. O 10 indica a largura do campo, e o s significa string. Ele alinha a string à direita dentro de um campo com largura 10.
  • %10d é para formatar um inteiro. O 10 é a largura do campo, e d representa um inteiro. Ele também alinha o inteiro à direita em um campo com largura 10.
  • %10.2f é usado para formatar um float. O 10 é a largura do campo, e o .2 especifica que queremos exibir o float com 2 casas decimais. Ele alinha o float à direita em um campo com largura 10.

Essa formatação garante que todas as colunas em nossa tabela sejam devidamente alinhadas, o que torna a saída muito mais fácil de ler e entender.

Resumo

Neste laboratório, você aprendeu como aprimorar uma classe Stock com novas funcionalidades. Você adicionou um método sell para simular a venda de ações, criou uma função read_portfolio para ler dados de ações de um arquivo CSV e convertê-los em objetos Stock, e desenvolveu uma função print_portfolio para exibir dados da carteira em uma tabela bem formatada.

Essas habilidades, incluindo a definição de métodos em uma classe, o trabalho com arquivos e a análise de dados, e a formatação da saída para melhor legibilidade, são fundamentais para a programação orientada a objetos em Python. Agora você pode aplicar esses conceitos para criar classes e utilitários mais complexos em seus programas Python.