Python类方法间如何传递返回值?解决DonutQueue类队列传递及报错问题
代码问题拆解与修正
核心问题说明
- 实例化方式错误:代码中每一次调用方法都通过
DonutQueue()新建临时实例,所有录入顾客的操作都在随用随丢的对象上完成,没有留存统一的队列实例。最终调用next_customer()时生成的是全新的空对象,内部的普通顾客队列、VIP队列都是初始空值,自然拿不到之前录入的数据,返回None。 - 类方法数据传递的认知偏差:同一个类实例下的所有方法,天然共享实例上定义的所有属性。
arrive方法中维护的self.queue、self.queue2是实例级别的共享数据,next_customer方法不需要接收arrive的返回值,直接读取这两个属性就可以拿到队列内容,完全不需要在next_customer内部调用arrive做值传递。 - 报错触发逻辑:在
next_customer中写入a = self.arrive(self.name,self.vip)的问题在于,直接调用next_customer的全新实例从未执行过arrive方法,self.name、self.vip两个属性从未被赋值,因此触发AttributeError。同时在arrive方法中把临时传入的name、vip直接设为实例属性本身就是设计错误:每录入一个新顾客,这两个属性就会被覆盖,根本无法长期留存有效数据。 - 业务逻辑错误:
next_customer的判断分支逻辑颠倒,self.queue2是VIP队列,非空时本应优先为VIP提供服务,代码中却在queue2非空时返回普通顾客队列,完全不符合需求;同时方法内没有实现队列出队的核心动作,仅判断队列是否为空,不符合先进先出的队列规则。
修正后可正常运行的代码
class DonutQueue(): def __init__(self): self.normal_queue = [] self.vip_queue = [] def arrive(self, name, vip): if vip == 1: self.vip_queue.append(name) return self.vip_queue else: self.normal_queue.append(name) return self.normal_queue def next_customer(self): # 优先处理VIP顾客 if self.vip_queue: return self.vip_queue.pop(0) # VIP队列排空后处理普通顾客 if self.normal_queue: return self.normal_queue.pop(0) # 两个队列都为空时返回None return None def main(): n = int(input("Enter the number of customers you want to add")) # 全程使用同一个实例维护队列,避免临时实例丢失数据 dq = DonutQueue() for i in range(0, n): name = input("Enter their name") vip = int(input("Are they a VIP")) dq.arrive(name, vip) print(dq.next_customer()) if __name__ == "__main__": main()
说明:类实例方法之间的数据流传递,优先通过实例属性完成持久化,不需要依赖方法返回值在方法之间手动传递——所有存储在
self上的属性,同个实例下的所有方法都可以直接访问,这也是类封装的核心特性之一。
内容的提问来源于stack exchange,提问作者Swayam Shah
相关产品推荐
相关产品推荐

