Определение простого класса

PythonPythonBeginner
Практиковаться сейчас

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

💡 Этот учебник переведен с английского с помощью ИИ. Чтобы просмотреть оригинал, вы можете перейти на английский оригинал

Введение

В этом практическом занятии вы научитесь улучшать класс Stock, предназначенный для представления акций в портфеле. Вы добавите новые методы и функциональность в этот класс, сделав его более универсальным и полезным.

Цели этого практического занятия включают добавление метода sell в существующий класс Stock, создание функции для чтения данных о портфеле акций из CSV-файла и еще одной функции для отображения данных о портфеле в отформатированной таблице. Файл, который необходимо изменить, - stock.py.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL python(("Python")) -.-> python/BasicConceptsGroup(["Basic Concepts"]) python(("Python")) -.-> python/ControlFlowGroup(["Control Flow"]) python(("Python")) -.-> python/FunctionsGroup(["Functions"]) python(("Python")) -.-> python/ObjectOrientedProgrammingGroup(["Object-Oriented Programming"]) python(("Python")) -.-> python/FileHandlingGroup(["File Handling"]) python(("Python")) -.-> python/PythonStandardLibraryGroup(["Python Standard Library"]) python/BasicConceptsGroup -.-> python/strings("Strings") python/ControlFlowGroup -.-> python/for_loops("For Loops") python/FunctionsGroup -.-> python/function_definition("Function Definition") python/ObjectOrientedProgrammingGroup -.-> python/classes_objects("Classes and Objects") python/FileHandlingGroup -.-> python/file_reading_writing("Reading and Writing Files") python/PythonStandardLibraryGroup -.-> python/data_collections("Data Collections") subgraph Lab Skills python/strings -.-> lab-132490{{"Определение простого класса"}} python/for_loops -.-> lab-132490{{"Определение простого класса"}} python/function_definition -.-> lab-132490{{"Определение простого класса"}} python/classes_objects -.-> lab-132490{{"Определение простого класса"}} python/file_reading_writing -.-> lab-132490{{"Определение простого класса"}} python/data_collections -.-> lab-132490{{"Определение простого класса"}} end

Добавление метода sell в класс Stock

На этом этапе мы улучшим класс Stock, добавив новый метод. Метод - это своего рода специальная функция, принадлежащая классу и способная работать с объектами, созданными на основе этого класса. Мы создадим метод с именем sell(nshares), который поможет нам смоделировать процесс продажи акций. При продаже акций количество акций, которые вы владеете, уменьшается, и этот метод будет обрабатывать это уменьшение для нас.

Что такое метод?

Прежде всего, давайте разберемся, что такое метод. Метод - это функция, определенная внутри класса. Он предназначен для работы с экземплярами (то есть индивидуальными копиями) этого класса. Когда метод вызывается для объекта, он может получить доступ ко всем атрибутам (характеристикам) этого объекта. Это делается с помощью параметра self. Параметр self представляет собой ссылку на объект, для которого вызывается метод. Таким образом, когда вы используете self внутри метода, вы ссылаетесь на конкретный объект, на котором метод действует.

Инструкции по реализации

  1. Сначала нам нужно открыть файл stock.py в редакторе. Для этого мы воспользуемся командной строкой. Откройте терминал и выполните следующую команду. Эта команда изменяет текущую директорию на папку project, где находится файл stock.py.
cd ~/project
  1. После того, как вы откроете файл stock.py, вам нужно найти определенный комментарий в классе Stock. Найдите комментарий ## TODO: Add sell(nshares) method here. Этот комментарий является меткой, которая показывает, где мы должны добавить наш новый метод sell.

  2. Теперь пришло время добавить метод sell. Этот метод будет принимать параметр nshares, который представляет количество акций, которые вы хотите продать. Основная задача этого метода - уменьшить атрибут shares объекта Stock на количество акций, которые вы продаете.

Вот код метода sell, который вам нужно добавить:

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

В этом коде self.shares ссылается на атрибут shares объекта Stock. Оператор -= вычитает значение nshares из текущего значения self.shares.

  1. После добавления метода sell вам нужно сохранить файл stock.py. Вы можете сделать это, нажав Ctrl+S на клавиатуре или выбрав "File > Save" в меню редактора.

  2. Чтобы убедиться, что наш метод sell работает правильно, мы создадим тестовый скрипт. Создайте новый Python-файл с именем test_sell.py и добавьте в него следующий код:

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

В этом скрипте мы сначала импортируем класс Stock из файла stock.py. Затем мы создаем объект Stock с именем s с тикером акции GOOG, 100 акциями и ценой 490.10. Мы выводим начальное количество акций. Затем мы вызываем метод sell для объекта s, чтобы продать 25 акций. Наконец, мы выводим количество акций после продажи.

  1. Теперь мы запустим тестовый скрипт, чтобы проверить, работает ли наш метод sell как ожидается. Откройте терминал снова и выполните следующую команду:
python3 test_sell.py

Если все работает правильно, вы должны увидеть вывод, похожий на следующий:

Initial shares: 100
Shares after selling: 75

Этот вывод подтверждает, что наш метод sell работает правильно. Он успешно уменьшил количество акций на указанную величину.

✨ Проверить решение и практиковаться

Чтение портфеля из CSV-файла

На этом этапе мы создадим функцию, которая читает данные о акциях из CSV-файла и возвращает список объектов Stock. Объект Stock представляет собой пакет акций, и по завершении этого этапа вы сможете прочитать портфель акций из CSV-файла.

Понимание CSV-файлов

CSV (Comma-Separated Values, разделенные запятыми значения) - это очень распространенный формат для хранения табличных данных. Представьте его как простую электронную таблицу. Каждая строка в CSV-файле представляет собой строку данных, а столбцы в этой строке разделены запятыми. Обычно первая строка CSV-файла содержит заголовки. Эти заголовки описывают, какого рода данные находятся в каждом столбце. Например, в CSV-файле с портфелем акций заголовками могут быть "Name", "Shares" и "Price".

Инструкции по реализации

  1. Сначала откройте файл stock.py в вашем редакторе кода. Если он уже открыт, это замечательно! Если нет, найдите его и откройте. Именно здесь мы будем добавлять нашу новую функцию.

  2. После того, как файл stock.py открыт, найдите комментарий ## TODO: Add read_portfolio(filename) function here. Этот комментарий является меткой, которая показывает, где нужно разместить нашу новую функцию.

  3. Ниже этого комментария добавьте следующую функцию. Эта функция называется read_portfolio, и она принимает имя файла в качестве аргумента. Цель этой функции - прочитать CSV-файл, извлечь данные о акциях и создать список объектов 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

Разберем, что делает эта функция. Сначала она создает пустой список с именем portfolio. Затем она открывает CSV-файл в режиме чтения. Инструкция next(f) пропускает первую строку, которая является строкой заголовка. После этого она проходит по каждой строке в файле. Для каждой строки она разбивает строку на список значений, извлекает имя, количество акций и цену, создает объект Stock и добавляет его в список portfolio. Наконец, она возвращает список portfolio.

  1. После добавления функции сохраните файл stock.py. Вы можете сделать это, нажав Ctrl+S на клавиатуре или выбрав "File > Save" в меню редактора кода. Сохранение файла гарантирует, что ваши изменения будут сохранены.

  2. Теперь нам нужно протестировать нашу функцию read_portfolio. Создайте новый Python-скрипт с именем test_portfolio.py. Этот скрипт импортирует функцию read_portfolio из файла stock.py, читает портфель из CSV-файла и выводит информацию о каждой акции в портфеле.

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

В этом скрипте мы сначала импортируем функцию read_portfolio. Затем мы вызываем функцию с именем файла portfolio.csv, чтобы получить список объектов Stock. После этого мы проходим по списку и выводим информацию о каждой акции. Наконец, мы выводим общее количество акций в портфеле.

  1. Чтобы запустить тестовый скрипт, откройте терминал или командную строку, перейдите в директорию, где находится файл test_portfolio.py, и выполните следующую команду:
python3 test_portfolio.py

Если все работает правильно, вы должны увидеть вывод, в котором перечислены все акции из файла portfolio.csv, а также их имена, количество и цены. Вы также должны увидеть общее количество акций в портфеле.

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

Этот вывод подтверждает, что ваша функция read_portfolio правильно читает CSV-файл и создает объекты Stock на основе его данных.

✨ Проверить решение и практиковаться

Форматирование и вывод данных о портфеле

На этом этапе мы создадим функцию, которая поможет нам отобразить данные о портфеле в хорошо организованной таблице. Портфель - это набор акций, и важно представлять эти данные в ясной и читаемой форме. Именно здесь приходит на помощь функция print_portfolio(portfolio). Эта функция принимает портфель в качестве входных данных и отображает его в таблице с заголовками и правильным выравниванием.

Форматирование строк в Python

В Python существует несколько способов форматировать строки. Форматирование строк - это важный навык, так как оно позволяет представлять данные более организованно и удобно для пользователя.

  • Оператор % представляет собой старый стиль форматирования строк. Он похож на шаблон, в котором вы можете вставлять значения в определенные места строки.
  • Метод str.format() - это другой способ. Он предоставляет больше гибкости и более чистый синтаксис для форматирования строк.
  • f - строки - это функция, введенная в Python 3.6 и позднее. Они очень удобны, так как позволяют встраивать выражения внутри строковых литералов.

Для этого упражнения мы будем использовать оператор %. Он особенно полезен, когда вы хотите создать столбцы фиксированной ширины, что именно нужно для нашей таблицы с портфелем.

Инструкции по реализации

  1. Сначала откройте файл stock.py в вашем редакторе. Если он уже открыт, это замечательно. Именно в этом файле мы напишем нашу функцию print_portfolio.

  2. После того, как файл открыт, найдите комментарий ## TODO: Add print_portfolio(portfolio) function here. Этот комментарий является меткой, которая показывает, где нужно добавить нашу новую функцию.

  3. Ниже этого комментария добавьте следующую функцию:

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))

Эта функция сначала выводит заголовочную строку таблицы, затем разделительную строку, а затем проходит по каждой акции в портфеле и выводит ее детали в отформатированном виде.

  1. После добавления функции сохраните файл. Вы можете сделать это, нажав Ctrl+S или выбрав "File > Save" в меню. Сохранение файла гарантирует, что ваши изменения будут сохранены.

  2. Теперь нам нужно протестировать нашу функцию. Создайте новый файл с именем test_print.py. Этот файл будет нашим тестовым скриптом. Добавьте в него следующий код:

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

Этот скрипт импортирует функции read_portfolio и print_portfolio из файла stock.py. Затем он читает данные о портфеле из CSV - файла и использует нашу только что созданную функцию print_portfolio для отображения этих данных.

  1. Наконец, запустите тестовый скрипт. Откройте терминал и введите следующую команду:
python3 test_print.py

Если все работает правильно, вы должны увидеть вывод, похожий на следующий:

      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

Этот вывод подтверждает, что ваша функция print_portfolio работает как ожидается. Она форматирует и отображает данные о портфеле в таблице с заголовками и выровненными столбцами, что делает вывод легко читаемым.

Понимание форматирования строк

Давайте более подробно рассмотрим, как работает форматирование строк в функции print_portfolio.

  • %10s используется для форматирования строки. Число 10 указывает ширину поля, а буква s обозначает строку. Она выравнивает строку по правому краю в поле шириной 10.
  • %10d используется для форматирования целого числа. Число 10 - это ширина поля, а буква d представляет целое число. Она также выравнивает целое число по правому краю в поле шириной 10.
  • %10.2f используется для форматирования числа с плавающей точкой. Число 10 - это ширина поля, а .2 указывает, что мы хотим отображать число с плавающей точкой с двумя знаками после запятой. Она выравнивает число с плавающей точкой по правому краю в поле шириной 10.

Это форматирование обеспечивает правильное выравнивание всех столбцов в нашей таблице, что делает вывод намного легче для чтения и понимания.

✨ Проверить решение и практиковаться

Резюме

В этом практическом занятии вы научились расширять класс Stock новыми возможностями. Вы добавили метод sell для имитации продажи акций, создали функцию read_portfolio для чтения данных о акциях из CSV - файла и преобразования их в объекты Stock, а также разработали функцию print_portfolio для отображения данных о портфеле в хорошо отформатированной таблице.

Эти навыки, включая определение методов в классе, работа с файлами и разбор данных, а также форматирование вывода для лучшей читаемости, являются основой объектно - ориентированного программирования на Python. Теперь вы можете применить эти концепции для создания более сложных классов и утилит в своих Python - программах.