如何使用类和对象简化投资游戏代码 实现快速新增加密货币等投资标的
优化方案
核心实现思路
将所有投资标的的通用属性、交易逻辑抽象为统一基类,特殊交易规则通过子类重写方法实现,所有标的放入公共列表统一管理,完全消除硬编码的if-else分支,最终实现2-3行代码新增投资标的的效果。
完整优化后代码
from typing import List import random # 基础投资资产基类 class InvestmentAsset: def __init__(self, name: str, unit: str, init_price: float, min_trade_amount: float = 0): self.name = name # 标的名称 self.unit = unit # 计量单位 self.price = init_price # 当前价格 self.min_trade_amount = min_trade_amount # 最小交易金额(美元) self.hold_amount = 0.0 # 用户持有量 # 打印当前价格信息(供报纸功能调用) def show_price_info(self) -> None: print(f"{self.name.upper()}: {self.price}$ 每{self.unit}") # 持有资产总价值 @property def hold_value(self) -> float: return self.hold_amount * self.price # 买入逻辑 def buy(self, input_amount: float, balance: float) -> tuple[float, str]: # input_amount 是用户要买的标的数量 total_cost = input_amount * self.price if total_cost > balance: return balance, "Insufficient Balance!" if total_cost < self.min_trade_amount: return balance, f"最小交易金额为{self.min_trade_amount}$" balance -= total_cost self.hold_amount += input_amount return balance, "Thank you! Have a Nice Day" # 卖出逻辑 def sell(self, input_amount: float, balance: float) -> tuple[float, str]: # input_amount 是用户要卖的标的数量 if input_amount > self.hold_amount: return balance, f"Insufficient {self.name}!" total_income = input_amount * self.price if total_income < self.min_trade_amount: return balance, f"最小交易金额为{self.min_trade_amount}$" balance += total_income self.hold_amount -= input_amount return balance, "Thank you! Have a Nice Day" # 每日价格波动逻辑,可根据需求重写 def update_daily_price(self) -> None: # 默认涨跌幅上下5% self.price = round(self.price * (1 + random.uniform(-0.05, 0.05)), 2) # 比特币特殊类,因为比特币的交易输入是按美元金额算的,和普通标的按数量算不同,所以重写买卖方法 class BitcoinAsset(InvestmentAsset): def buy(self, input_dollar: float, balance: float) -> tuple[float, str]: if input_dollar > balance: return balance, "Insufficient Balance!" if input_dollar < self.min_trade_amount: return balance, f"You can only buy above {self.min_trade_amount}$" self.hold_amount += input_dollar / self.price balance -= input_dollar return balance, "Thank you! Have a Nice Day" def sell(self, input_dollar: float, balance: float) -> tuple[float, str]: if input_dollar > self.hold_value: return balance, "Insufficient Bitcoin!" if input_dollar < self.min_trade_amount: return balance, f"You can only sale above {self.min_trade_amount} Dollars" self.hold_amount -= input_dollar / self.price balance += input_dollar return balance, "Thank you! Have a Nice Day" # ---------------------- 初始化配置 ---------------------- balance = 10000.0 # 初始余额 day = 1 # 所有投资标的统一管理 assets: List[InvestmentAsset] = [ InvestmentAsset(name="黄金", unit="克", init_price=63, min_trade_amount=0), BitcoinAsset(name="比特币", unit="枚", init_price=34000, min_trade_amount=500) ] # 如需新增标的,仅需加1-2行即可,比如新增苹果股票: # assets.append(InvestmentAsset(name="苹果股票", unit="股", init_price=175, min_trade_amount=0)) # ---------------------- 业务逻辑 ---------------------- def newspaper(): for asset in assets: asset.show_price_info() print("An investment in knowledge pays the best interest.") def invest(): global balance print("====Which Thing you want to Buy====") for idx, asset in enumerate(assets, start=1): print(f"{idx}. {asset.name}") print(f"{len(assets)+1}. Nothing, Go Back") try: investInputKey = int(input()) if investInputKey == len(assets)+1: print("Thank you! Have a Nice Day") return if 1<= investInputKey <= len(assets): selected_asset = assets[investInputKey-1] print(f"{selected_asset.name}: {selected_asset.price} 每{selected_asset.unit}\n") print("1. Buy") print("2. Sell") print("3. Exit") op_input = int(input()) if op_input == 3: print("Thank you! Have a Nice Day") return if op_input == 1: if isinstance(selected_asset, BitcoinAsset): howMuch = float(input("Enter Bitcoin Amount in Dollars: ")) else: howMuch = float(input(f"Enter Amount in {selected_asset.unit}: ")) balance, msg = selected_asset.buy(howMuch, balance) print(msg) elif op_input == 2: if isinstance(selected_asset, BitcoinAsset): howMuch = float(input("Enter Bitcoin Amount in Dollars: ")) else: howMuch = float(input(f"Enter Amount in {selected_asset.unit}: ")) balance, msg = selected_asset.sell(howMuch, balance) print(msg) else: print("Wrong Input!") else: print("Wrong Input!") except ValueError: print("Please enter valid number!") while True: print("========HOME========\n") print(f"====Day-{day}====") print(f"====Balance-{balance}$ ====\n") print("1. Newspaper") print("2. Invest") print("3. My Portfolio") print("4. Next Day") print("5. Exit") try: inputKey = int(input()) if inputKey == 1: newspaper() elif inputKey == 2: invest() elif inputKey == 3: print("========Portfolio========\n") for asset in assets: print(f"{asset.name}: {round(asset.hold_amount,4)} {asset.unit},当前市值{round(asset.hold_value,2)}$") elif inputKey == 4: day += 1 print(f"This is day {day}") # 批量更新所有标的价格 for asset in assets: asset.update_daily_price() elif inputKey == 5: confirm = input("Are you sure to exit? (y/n): ").lower() if confirm == 'y': break else: print("Wrong Input! Try Again") except ValueError: print("Please enter valid number!")
新增投资标的方法
无特殊交易规则的标的仅需1行代码即可完成新增,例如新增特斯拉股票:
assets.append(InvestmentAsset(name="特斯拉股票", unit="股", init_price=242, min_trade_amount=0))
有特殊交易规则的标的仅需继承InvestmentAsset类重写对应方法,再实例化加入assets列表即可,全程不需要修改原有业务逻辑代码。
内容的提问来源于stack exchange,提问作者Tashvik Bansal
相关产品推荐
相关产品推荐

