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?:
重复循环的核心原因
多次创建对象触发重复初始化:
result()函数里连续创建了4个对象(2个Employee、2个ProductionWorker),每个对象的创建都会执行Employee的__init__方法——而__init__里包含了姓名、编号的输入,还主动调用了ProductionWorker.Shift(self)触发班次输入,等于每创建一个对象就要走一遍完整的姓名→编号→班次输入流程,4个对象就会触发4轮重复输入。子类继承导致的重复执行:
ProductionWorker是Employee的子类,创建ProductionWorker实例时会自动先执行父类Employee的__init__方法,所以创建userShift和userPay时,同样会触发姓名、编号、班次的输入流程,进一步加剧了重复。方法调用逻辑错误:
Employee的__init__里用ProductionWorker.Shift(self)这种方式调用子类方法,相当于强制给Employee实例绑定子类的方法逻辑,这不仅破坏了类的继承设计,还导致每次创建Employee对象都必须执行班次输入,完全没必要。
额外的设计问题
其实你不需要创建多个对象,ProductionWorker作为Employee的子类,本身就继承了姓名、编号属性,只需要创建一个ProductionWorker实例,就能一次性收集所有信息,然后直接打印该实例的属性即可。
内容的提问来源于stack exchange,提问作者whoami
相关产品推荐
相关产品推荐

