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

Python继承类实例化触发重复输入循环的原因分析

代码重复循环的原因分析

需求背景

编写程序收集员工姓名、编号、时薪及班次信息,存入两个类后重新打印,但运行时出现重复输入循环。

原代码

class Employee(): # Set class that keeps data attributes of name & number

    def __init__(self):
        name = input("Name?: ")
        self.name = name
        
        number = input("Number?: ")
        self.number = number
        
        ProductionWorker.Shift(self)
        
class ProductionWorker(Employee):
              
    def Pay(self):
        pay = input("Pay?: ")
        self.pay = pay
        
    def Shift(self):
        shift = input("Shift?: ")
        self.shift = shift
        
        if shift == 1:
            self.shift = "day"
            ProductionWorker.Pay(self)
        elif shift == 2:
            self.shift = "night"
            ProductionWorker.Pay(self)
    

def result():  # Print results
    userName = Employee()
    userNumber = Employee()
    userShift = ProductionWorker()
    userPay = ProductionWorker()

    print(userName.name)
    print(userNumber.number)
    print(userShift.shift)
    print("$" + userPay.pay)
    
    quit()
    
result()  

运行异常结果

Name?: John
Number?: 1234567 
Shift?: 1
Name?: John..
Number?: 1234567
Shift?: again?
Name?: 

重复循环的核心原因

  1. 多次创建对象触发重复初始化:result()函数里连续创建了4个对象(2个Employee、2个ProductionWorker),每个对象的创建都会执行Employee的__init__方法——而__init__里包含了姓名、编号的输入,还主动调用了ProductionWorker.Shift(self)触发班次输入,等于每创建一个对象就要走一遍完整的姓名→编号→班次输入流程,4个对象就会触发4轮重复输入。

  2. 子类继承导致的重复执行:ProductionWorker是Employee的子类,创建ProductionWorker实例时会自动先执行父类Employee的__init__方法,所以创建userShift和userPay时,同样会触发姓名、编号、班次的输入流程,进一步加剧了重复。

  3. 方法调用逻辑错误:Employee的__init__里用ProductionWorker.Shift(self)这种方式调用子类方法,相当于强制给Employee实例绑定子类的方法逻辑,这不仅破坏了类的继承设计,还导致每次创建Employee对象都必须执行班次输入,完全没必要。

额外的设计问题

其实你不需要创建多个对象,ProductionWorker作为Employee的子类,本身就继承了姓名、编号属性,只需要创建一个ProductionWorker实例,就能一次性收集所有信息,然后直接打印该实例的属性即可。


内容的提问来源于stack exchange,提问作者whoami

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 11:46:08