Python自定义Order、OrderBook类订单存储排序及打印问题咨询
问题修复方案
你现有代码存在4个核心问题,逐一修改即可实现需求:
- 错误混合使用
SortedList和普通sorted()方法:你已经用了支持自动排序的SortedList,后续调用sorted()会把它转成普通Python列表,丢失add方法导致后续提交订单报错
- 错误混合使用
- 列表打印时显示对象内存地址:Python打印列表元素时会调用对象的
__repr__方法,你只定义了__str__,需要补充__repr__的实现
- 列表打印时显示对象内存地址:Python打印列表元素时会调用对象的
submit方法没有返回值:你调用print(res1.submit())时,方法默认返回None,所以会打印None
- 构造函数使用可变默认参数:
__init__(self, bids=[], asks=[])的写法会导致所有OrderBook实例共用同一个买卖盘列表,属于Python常见坑点
- 构造函数使用可变默认参数:
修改后完整代码
# 记得补SortedList的导入,原代码缺失该部分 from sortedcontainers import SortedList class Order: def __init__(self, order_type, price, quantity, direction): self.order_type = order_type self.price = price self.quantity = quantity self.direction = direction def __str__(self): # 自定义打印的订单信息格式,可按需调整 return f"[{self.direction}] {self.order_type} 价格:{self.price} 数量:{self.quantity}" # 补充__repr__实现,和__str__保持一致即可解决列表打印显示地址的问题 __repr__ = __str__ class OrderBook: # 把可变默认参数改为None,内部初始化空列表避免实例数据共用问题 def __init__(self, bids=None, asks=None): bids = bids if bids is not None else [] asks = asks if asks is not None else [] # SortedList会自动按指定key维护顺序,不需要手动调用sorted self.bids = SortedList(bids, key = lambda order: -order.price) self.asks = SortedList(asks, key = lambda order: order.price) def submit(self, order): if order.direction == 'buy': self.bids.add(order) print("当前买盘:", self.bids) elif order.direction == 'sell': self.asks.add(order) print("当前卖盘:", self.asks) # 按需返回当前更新后的订单列表 return self.bids if order.direction == 'buy' else self.asks def remove(self, order): if order.direction == 'buy': self.bids.remove(order) elif order.direction == 'sell': self.asks.remove(order) # 测试用例 res1 = OrderBook() res1.submit(Order("AAPL",70,1,'buy')) res1.submit(Order("DIS",70,1,'buy')) res1.submit(Order("DIS",80,1,'buy')) res1.submit(Order("AAPL",70,1,'sell')) res1.submit(Order("DIS",15,2,'buy')) res1.submit(Order("DIS",15,1,'buy')) # 单独打印全量买盘/卖盘的方法 # print("所有买盘:", res1.bids) # print("所有卖盘:", res1.asks)
效果说明
运行后会按顺序打印每次提交后的买卖盘列表,订单会按指定规则自动排序,相同价格的订单按插入顺序排列,不会再出现内存地址和None输出。如果需要单独获取当前全量买盘/卖盘数据,直接调用res1.bids、res1.asks即可。
内容的提问来源于stack exchange,提问作者i L
相关产品推荐
相关产品推荐

