定义一个简单的类

PythonPythonBeginner
立即练习

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

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

简介

在这个实验中,你将学习如何增强一个用于表示股票持仓的 Stock 类。你将为这个类添加新的方法和功能,使其更加通用和实用。

这个实验的目标包括:为现有的 Stock 类添加一个 sell 方法,创建一个从 CSV 文件中读取股票投资组合数据的函数,以及另一个以格式化表格形式显示投资组合数据的函数。需要修改的文件是 stock.py


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL python(("Python")) -.-> python/FileHandlingGroup(["File Handling"]) python(("Python")) -.-> python/PythonStandardLibraryGroup(["Python Standard Library"]) 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/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

为 Stock 类添加 sell 方法

在这一步中,我们将通过添加一个新方法来增强 Stock 类。方法类似于属于某个类的特殊函数,它可以对从该类创建的对象进行操作。我们将创建一个名为 sell(nshares) 的方法,该方法将帮助我们模拟出售股票的操作。当你出售股票时,你持有的股票数量会减少,这个方法将为我们处理这种数量的减少。

什么是方法?

让我们首先了解一下什么是方法。方法是定义在类内部的函数。它旨在对该类的实例(类似于单个副本)进行操作。当在对象上调用方法时,它可以访问该对象的所有属性(特征)。这是通过 self 参数实现的。self 参数是对调用该方法的对象的引用。因此,当你在方法内部使用 self 时,你指的是该方法正在操作的特定对象。

实现说明

  1. 首先,你需要在编辑器中打开 stock.py 文件。为此,我们将使用命令行。打开你的终端并运行以下命令。此命令将目录更改为包含 stock.py 文件的 project 文件夹。
cd ~/project
  1. 打开 stock.py 文件后,你需要在 Stock 类中找到一个特定的注释。查找注释 ## TODO: Add sell(nshares) method here。这个注释是一个占位符,指示我们应该在哪里添加新的 sell 方法。

  2. 现在,是时候添加 sell 方法了。这个方法将接受一个名为 nshares 的参数,该参数表示你要出售的股票数量。这个方法的主要任务是将 Stock 对象的 shares 属性减少你要出售的股票数量。

以下是你需要添加的 sell 方法的代码:

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

在这段代码中,self.shares 指的是 Stock 对象的 shares 属性。-= 运算符从 self.shares 的当前值中减去 nshares 的值。

  1. 添加 sell 方法后,你需要保存 stock.py 文件。你可以通过按下键盘上的 Ctrl+S 组合键,或者在编辑器的菜单中选择“文件 > 保存”来完成保存操作。

  2. 为了确保我们的 sell 方法能正常工作,我们将创建一个测试脚本。创建一个名为 test_sell.py 的新 Python 文件,并在其中添加以下代码:

## 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.py 文件中导入 Stock 类。然后,我们创建一个名为 sStock 对象,其股票代码为 GOOG,持有 100 股,价格为 490.10。我们打印初始的股票数量。之后,我们在 s 对象上调用 sell 方法来出售 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 文件中,表头可能是“名称”、“股数”和“价格”。

实现说明

  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 组合键,或者在代码编辑器的菜单中选择“文件 > 保存”来完成保存操作。保存文件可确保你的更改得以保留。

  2. 现在,我们需要测试 read_portfolio 函数。创建一个名为 test_portfolio.py 的新 Python 脚本。这个脚本将从 stock.py 文件中导入 read_portfolio 函数,从 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 组合键,或者在菜单中选择“文件 > 保存”来完成保存操作。保存文件可确保你的更改得以保留。

  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)

这个脚本从 stock.py 文件中导入 read_portfolioprint_portfolio 函数。然后,它从 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 指定我们要将浮点数显示为保留 2 位小数。它将浮点数在宽度为 10 的字段内右对齐。

这种格式化方式确保了表格中的所有列都能正确对齐,从而使输出更易于阅读和理解。

✨ 查看解决方案并练习

总结

在这个实验中,你学习了如何为 Stock 类添加新功能。你添加了 sell 方法来模拟出售股票,创建了 read_portfolio 函数从 CSV 文件中读取股票数据并将其转换为 Stock 对象,还开发了 print_portfolio 函数以格式良好的表格形式展示投资组合数据。

这些技能,包括在类中定义方法、处理文件和解析数据,以及为提高可读性而格式化输出,是 Python 面向对象编程的基础。现在,你可以将这些概念应用到 Python 程序中,创建更复杂的类和实用工具。