Definir una clase simple

Beginner

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

Introducción

En este laboratorio, aprenderás a mejorar una clase Stock diseñada para representar participaciones en acciones. Agregarás nuevos métodos y funcionalidades a esta clase, haciéndola más versátil y útil.

Los objetivos de este laboratorio incluyen agregar un método sell a la clase Stock existente, crear una función para leer datos de carteras de acciones desde un archivo CSV y otra función para mostrar los datos de la cartera en una tabla formateada. El archivo a modificar es stock.py.

Este es un Guided Lab, que proporciona instrucciones paso a paso para ayudarte a aprender y practicar. Sigue las instrucciones cuidadosamente para completar cada paso y obtener experiencia práctica. Los datos históricos muestran que este es un laboratorio de nivel principiante con una tasa de finalización del 97%. Ha recibido una tasa de reseñas positivas del 100% por parte de los estudiantes.

Agregar un método sell a la clase Stock

En este paso, vamos a mejorar la clase Stock agregando un nuevo método. Un método es como una función especial que pertenece a una clase y puede trabajar con los objetos creados a partir de esa clase. Crearemos un método llamado sell(nshares) que nos ayudará a simular la acción de vender acciones de una empresa. Cuando se venden acciones, la cantidad de acciones que se poseen disminuye, y este método se encargará de esa reducción para nosotros.

¿Qué es un método?

Primero, entendamos qué es un método. Un método es una función que se define dentro de una clase. Está diseñado para operar en instancias (que son como copias individuales) de esa clase. Cuando se llama a un método en un objeto, puede acceder a todos los atributos (características) de ese objeto. Lo hace a través del parámetro self. El parámetro self es una referencia al objeto en el que se está llamando al método. Entonces, cuando se usa self dentro de un método, se está refiriendo al objeto específico sobre el que está actuando el método.

Instrucciones de implementación

  1. Primero, necesitamos abrir el archivo stock.py en el editor. Para hacer esto, usaremos la línea de comandos. Abra su terminal y ejecute el siguiente comando. Este comando cambia el directorio al directorio project donde se encuentra el archivo stock.py.
cd ~/project
  1. Una vez que tenga abierto el archivo stock.py, debe encontrar un comentario específico en la clase Stock. Busque el comentario ## TODO: Add sell(nshares) method here. Este comentario es un marcador que indica dónde debemos agregar nuestro nuevo método sell.

  2. Ahora, es el momento de agregar el método sell. Este método tomará un parámetro llamado nshares, que representa la cantidad de acciones que desea vender. El trabajo principal de este método es disminuir el atributo shares del objeto Stock en la cantidad de acciones que está vendiendo.

Aquí está el código para el método sell que debe agregar:

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

En este código, self.shares se refiere al atributo shares del objeto Stock. El operador -= resta el valor de nshares del valor actual de self.shares.

  1. Después de agregar el método sell, debe guardar el archivo stock.py. Puede hacer esto presionando Ctrl+S en su teclado o seleccionando "Archivo > Guardar" desde el menú de su editor.

  2. Para asegurarnos de que nuestro método sell funcione correctamente, crearemos un script de prueba. Cree un nuevo archivo de Python llamado test_sell.py y agregue el siguiente código a él:

## 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}")

En este script, primero importamos la clase Stock del archivo stock.py. Luego creamos un objeto Stock llamado s con el símbolo de la acción GOOG, 100 acciones y un precio de 490.10. Imprimimos la cantidad inicial de acciones. Después de eso, llamamos al método sell en el objeto s para vender 25 acciones. Finalmente, imprimimos la cantidad de acciones después de la venta.

  1. Ahora, ejecutaremos el script de prueba para ver si nuestro método sell está funcionando como se espera. Abra su terminal nuevamente y ejecute el siguiente comando:
python3 test_sell.py

Si todo está funcionando correctamente, debería ver una salida similar a esta:

Initial shares: 100
Shares after selling: 75

Esta salida confirma que nuestro método sell está funcionando correctamente. Ha reducido con éxito la cantidad de acciones en la cantidad que especificamos.

Leer una cartera desde un archivo CSV

En este paso, vamos a crear una función que lea datos de acciones desde un archivo CSV y devuelva una lista de objetos Stock. Un objeto Stock representa una participación en acciones, y al final de este paso, podrás leer una cartera de acciones desde un archivo CSV.

Comprender los archivos CSV

CSV, que significa Valores Separados por Comas (Comma-Separated Values en inglés), es un formato muy común para almacenar datos tabulares. Puedes pensar en él como una hoja de cálculo simple. Cada línea en un archivo CSV representa una fila de datos, y las columnas dentro de esa fila están separadas por comas. Por lo general, la primera línea de un archivo CSV contiene encabezados. Estos encabezados describen qué tipo de datos hay en cada columna. Por ejemplo, en un archivo CSV de una cartera de acciones, los encabezados podrían ser "Nombre", "Acciones" y "Precio".

Instrucciones de implementación

  1. Primero, abre el archivo stock.py en tu editor de código. Si ya está abierto, ¡estupendo! Si no, encuéntralo y ábrelo. Aquí es donde agregaremos nuestra nueva función.

  2. Una vez que el archivo stock.py esté abierto, busca el comentario ## TODO: Add read_portfolio(filename) function here. Este comentario es un marcador que nos indica dónde colocar nuestra nueva función.

  3. Debajo de ese comentario, agrega la siguiente función. Esta función se llama read_portfolio y toma un nombre de archivo como argumento. El propósito de esta función es leer el archivo CSV, extraer los datos de las acciones y crear una 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

Analicemos lo que hace esta función. Primero, crea una lista vacía llamada portfolio. Luego, abre el archivo CSV en modo lectura. La declaración next(f) omite la primera línea, que es la línea de encabezados. Después de eso, recorre cada línea del archivo. Para cada línea, divide la línea en una lista de valores, extrae el nombre, la cantidad de acciones y el precio, crea un objeto Stock y lo agrega a la lista portfolio. Finalmente, devuelve la lista portfolio.

  1. Después de agregar la función, guarda el archivo stock.py. Puedes hacer esto presionando Ctrl+S en tu teclado o seleccionando "Archivo > Guardar" desde el menú de tu editor de código. Guardar el archivo asegura que tus cambios se conserven.

  2. Ahora, necesitamos probar nuestra función read_portfolio. Crea un nuevo script de Python llamado test_portfolio.py. Este script importará la función read_portfolio del archivo stock.py, leerá la cartera desde un archivo CSV e imprimirá información sobre cada acción en la cartera.

## 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)}")

En este script, primero importamos la función read_portfolio. Luego, llamamos a la función con el nombre de archivo portfolio.csv para obtener la lista de objetos Stock. Después de eso, recorremos la lista e imprimimos información sobre cada acción. Finalmente, imprimimos el número total de acciones en la cartera.

  1. Para ejecutar el script de prueba, abre tu terminal o símbolo del sistema, navega hasta el directorio donde se encuentra el archivo test_portfolio.py y ejecuta el siguiente comando:
python3 test_portfolio.py

Si todo está funcionando correctamente, deberías ver una salida que enumere todas las acciones del archivo portfolio.csv, junto con sus nombres, cantidad de acciones y precios. También deberías ver el número total de acciones en la cartera.

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 salida confirma que tu función read_portfolio está leyendo correctamente el archivo CSV y creando objetos Stock a partir de sus datos.

Formatear e imprimir los datos de la cartera

En este paso, vamos a crear una función que nos ayudará a mostrar los datos de la cartera en una tabla bien organizada. Una cartera es una colección de acciones, y es importante presentar estos datos de manera clara y legible. Aquí es donde entra en juego la función print_portfolio(portfolio). Esta función tomará una cartera como entrada y la mostrará en una tabla con encabezados y alineación adecuada.

Formateo de cadenas en Python

En Python, hay múltiples formas de formatear cadenas. El formateo de cadenas es una habilidad crucial, ya que te permite presentar los datos de manera más organizada y amigable para el usuario.

  • El operador % es un estilo más antiguo de formateo de cadenas. Es como una plantilla donde puedes insertar valores en lugares específicos de una cadena.
  • El método str.format() es otra forma. Proporciona más flexibilidad y una sintaxis más limpia para formatear cadenas.
  • Las f - cadenas son una característica introducida en Python 3.6 y versiones posteriores. Son muy convenientes, ya que te permiten incrustar expresiones dentro de literales de cadena.

Para este ejercicio, usaremos el operador %. Es especialmente útil cuando quieres crear columnas de ancho fijo, que es exactamente lo que necesitamos para nuestra tabla de cartera.

Instrucciones de implementación

  1. Primero, abre el archivo stock.py en tu editor. Si ya está abierto, está bien. En este archivo escribiremos nuestra función print_portfolio.

  2. Una vez que el archivo esté abierto, busca el comentario ## TODO: Add print_portfolio(portfolio) function here. Este comentario es un marcador que nos indica dónde agregar nuestra nueva función.

  3. Debajo de ese comentario, agrega la siguiente función:

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 función primero imprime la fila de encabezados de la tabla, luego una línea separadora y, finalmente, recorre cada acción en la cartera e imprime sus detalles de manera formateada.

  1. Después de agregar la función, guarda el archivo. Puedes hacer esto presionando Ctrl+S o seleccionando "Archivo > Guardar" desde el menú. Guardar el archivo asegura que tus cambios se conserven.

  2. Ahora, necesitamos probar nuestra función. Crea un nuevo archivo llamado test_print.py. Este archivo será nuestro script de prueba. Agrega el siguiente código a él:

## 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 las funciones read_portfolio y print_portfolio del archivo stock.py. Luego lee los datos de la cartera de un archivo CSV y usa nuestra recién creada función print_portfolio para mostrarlos.

  1. Finalmente, ejecuta el script de prueba. Abre tu terminal y escribe el siguiente comando:
python3 test_print.py

Si todo está funcionando correctamente, deberías ver una salida 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 salida confirma que tu función print_portfolio está funcionando como se espera. Formatea y muestra los datos de la cartera en una tabla con encabezados y columnas alineadas, lo que lo hace fácil de leer.

Comprender el formateo de cadenas

Echemos un vistazo más de cerca a cómo funciona el formateo de cadenas en la función print_portfolio.

  • %10s se utiliza para formatear una cadena. El 10 indica el ancho del campo, y la s representa una cadena. Alinea la cadena a la derecha dentro de un campo de ancho 10.
  • %10d es para formatear un entero. El 10 es el ancho del campo, y d representa un entero. También alinea el entero a la derecha en un campo de ancho 10.
  • %10.2f se utiliza para formatear un número de punto flotante. El 10 es el ancho del campo, y el .2 especifica que queremos mostrar el número de punto flotante con 2 decimales. Alinea el número de punto flotante a la derecha en un campo de ancho 10.

Este formateo asegura que todas las columnas en nuestra tabla estén adecuadamente alineadas, lo que hace que la salida sea mucho más fácil de leer y entender.

Resumen

En este laboratorio, has aprendido cómo mejorar una clase Stock con nueva funcionalidad. Has agregado un método sell para simular la venta de acciones, creado una función read_portfolio para leer datos de acciones desde un archivo CSV y convertirlos en objetos Stock, y desarrollado una función print_portfolio para mostrar los datos de la cartera en una tabla bien formateada.

Estas habilidades, incluyendo la definición de métodos en una clase, el trabajo con archivos y el análisis de datos, y el formateo de la salida para una mejor legibilidad, son fundamentales para la programación orientada a objetos en Python. Ahora puedes aplicar estos conceptos para crear clases y utilidades más complejas en tus programas de Python.