🐸

发票生成器

Python 基础python-architect-33-the-invoice-generator
奖励: 150 XP
|

发票生成器

你终于接到了第一个自由职业的私单!但现在最难的部分来了:收钱。

问题: 每次给客户开票,你都要手动拿出计算器算小计(Subtotal)、算当地的税费、对齐格式打印,然后祈祷自己没算错数学题。如果你有 50 个客户,这就是一场噩梦。 目标: 让我们为发票打造一个“蓝图” (类, Class)。把这些业务逻辑封装在一个对象内部,保证每一次生成的单据都绝对一致且永不出错。

OOP 面向对象发票蓝图

封装 (Encapsulation) 的威力

通过把计算逻辑移入一个 Class 中,使用这段代码的人(甚至是下周一忘了代码怎么写的你自己)根本不需要关心具体的算税公式是什么。他们只需要调用 invoice.set_tax_rate(0.1)invoice.generate(),然后 Invoice 对象就会在内部自己把所有的脏活累活干完!

你的毕业设计挑战 (Capstone Project)

这不仅仅是一道练习题,更是你的毕业设计。你不仅要补全 Invoice 这个类的内部实现,还要亲手实例化它,并利用之前学过的知识读取 orders.csv 将真实数据喂给它——这是对你整个系列所学知识的终极融合考验!

1
构造函数 (The Constructor)

补全 __init__(self, client_name) 方法。它应该保存 client_name。还需要创建一个名为 self.items 的空列表,以及把 self.tax_rate(税率)设为 0.0

2
添加商品 (Adding Items)

补全 add_item(self, name, price)。它应该将一个包含商品名称和价格的 元组 (Tuple) (name, price) 放入 (.append()) 到 self.items 列表中。

3
设置税率 (Setting Taxes)

补全 set_tax_rate(self, rate)。更新对象内部的 self.tax_rate 属性。

4
引擎 (The Engine)

补全最核心的 generate(self) 方法。循环遍历 self.items 得出小计 subtotal。计算税费 tax 以及最终的总价 total,并返回 (return) total

5
毕业特训:实例化

拉到代码最下方,打破常规。亲手将你的蓝图变为实体发票:my_invoice = Invoice("Global Tech Corp")

6
毕业特训:投喂数据

利用文件 I/O (with open("orders.csv", "r") as file:) 读取订单记录。记得跳过表头行。循环切割每一行字符串 (用逗号),将价格转换为 float() 浮点数,然后使用 my_invoice.add_item() 把它们统统存入你的发票对象中!

7
毕业特训:一键生成

设置对象税率为 0.1 (10%),然后调用 .generate() 生成最终账单,并将金钱返回值存储在 final_amount 变量中!

参考答案
点击展开
参考答案:

这就是专业软件工程该有的样子。你创造了一个可以自动处理复杂行为的、可重复使用的智能对象,并将外界的真实原始数据喂给了它!

class Invoice:
  def __init__(self, client_name):
      self.client_name = client_name
      self.items = []
      self.tax_rate = 0.0
      
  def add_item(self, name, price):
      self.items.append((name, price))
      
  def set_tax_rate(self, rate):
      self.tax_rate = rate
      
  def generate(self):
      subtotal = 0
      print(f"--- INVOICE FOR: {self.client_name} ---")
      
      for name, price in self.items:
          print(f"- {name}: ${price}")
          subtotal += price
          
      tax = subtotal * self.tax_rate
      total = subtotal + tax
      
      print(f"\nSubtotal: ${subtotal:.2f}")
      print(f"Tax:      ${tax:.2f}")
      print(f"Total:    ${total:.2f}")
      print("---------------------------------")
      return total

# --- 毕业设计实现 ---

# 实例化类
my_invoice = Invoice("Global Tech Corp")

# 读取外部 CSV 数据存入对象中
with open("orders.csv", "r") as file:
  lines = file.readlines()
  for line in lines[1:]: # 使用切片跳过第一行表头
      item_name, price_str = line.strip().split(",")
      my_invoice.add_item(item_name, float(price_str))

# 计算生成最终账单
my_invoice.set_tax_rate(0.1)
final_amount = my_invoice.generate()
Loading...
终端输出
Terminal
Ready to run...