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

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

说明

  1. 父类Queue的self.queue是实例属性,子类可以直接访问,通过判断其长度是否为0就能确定队列是否为空
  2. 原代码中重写的get方法如果没有额外需求可以去掉,父类的get已经满足功能;如果需要捕获异常,也可以保留,但不影响isempty的实现
  3. 这种实现方式不会修改队列的任何状态,完全不影响后续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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 06:40:29