Python子类SuperQueue的isempty方法实现错误,求正确方案
问题描述
我正在学习Python Institute的队列教程,定义了三个类:
- 父类
Queue包含put和get方法,当队列为空时get方法会抛出QueueError异常 - 子类
SuperQueue需要新增isempty方法,返回队列是否为空
我原本的实现方式是在子类中重写get方法,并在isempty方法里调用get获取元素:若能获取到则放回队列并返回False,否则返回True。但问题在于,驱动程序向队列添加元素后会先调用isempty,若队列非空则调用get打印元素,导致get被调用两次,无法按输入顺序输出元素。
请问如何正确实现isempty方法?
附带原代码:
class QueueError: pass class Queue: def __init__(self): self.queue = [] def put(self, elem): self.queue.insert(0, elem) def get(self): if len(self.queue) > 0: elem = self.queue[-1] del self.queue[-1] return elem else: raise QueueError class SuperQueue(Queue): def __init__(self): Queue.__init__(self) def get(self): try: v = Queue.get(self) return v except: print('exception') def isempty(self): v = self.get() if v: self.put(v) return False return True que = SuperQueue() que.put(1) que.put('dog') que.put(False) for i in range(4): if not que.isempty(): print(que.get()) else: print("Queue empty") # 无法按输入顺序获取队列元素,第二个元素先输出,且无法获取第三个元素(False)
解决方案
你的核心问题是用get方法来判断队列是否为空,这会修改队列状态:取出元素后用put放回时,因为put是往队列头部插入,放回的元素会跑到队首,直接打乱了FIFO的顺序,同时两次调用get也会导致元素被重复取出。
正确的实现方式是直接访问队列的内部存储来判断是否为空,不需要调用get方法:
修改后的SuperQueue类
class SuperQueue(Queue): def __init__(self): super().__init__() # 推荐用super()调用父类构造,更符合Python规范 def isempty(self): # 直接判断父类队列的长度即可,不会修改队列状态 return len(self.queue) == 0
说明
- 父类
Queue的self.queue是实例属性,子类可以直接访问,通过判断其长度是否为0就能确定队列是否为空 - 原代码中重写的
get方法如果没有额外需求可以去掉,父类的get已经满足功能;如果需要捕获异常,也可以保留,但不影响isempty的实现 - 这种实现方式不会修改队列的任何状态,完全不影响后续
get方法的调用顺序
完整修正代码及运行结果
class QueueError: pass class Queue: def __init__(self): self.queue = [] def put(self, elem): self.queue.insert(0, elem) def get(self): if len(self.queue) > 0: elem = self.queue[-1] del self.queue[-1] return elem else: raise QueueError class SuperQueue(Queue): def __init__(self): super().__init__() def isempty(self): return len(self.queue) == 0 que = SuperQueue() que.put(1) que.put('dog') que.put(False) for i in range(4): if not que.isempty(): print(que.get()) else: print("Queue empty")
运行结果:
1 dog False Queue empty
完全符合FIFO的预期输出。
内容的提问来源于stack exchange,提问作者kobosh
相关产品推荐
相关产品推荐

