You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用类和对象简化投资游戏代码 实现快速新增加密货币等投资标的

优化方案

核心实现思路

将所有投资标的的通用属性、交易逻辑抽象为统一基类,特殊交易规则通过子类重写方法实现,所有标的放入公共列表统一管理,完全消除硬编码的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.12 23:27:01