导入ATM类至Virtual Doctor后函数无响应问题排查
核心原因分析
你遇到的问题根源出在ATM代码里的start()方法——里面的if __name__ == '__main__':判断限制了代码的执行场景:
这个判断只在当前脚本被直接运行(比如你单独跑ATM.py)时才会生效,当你把Bank类导入到Virtual Doctor程序中时,ATM脚本的
__name__会变成它的模块名NewATM,而非__main__,所以start()方法里的登录逻辑根本不会被执行,程序直接跳过这一步继续往下走,看起来就像是调用b2.start()后无响应直接退出。
另外还有个小问题:原ATM代码里调用类方法时用的是全局实例b1(比如b1.pinpasscheck(...)),这在单独运行ATM时没问题,但当你在Virtual Doctor里创建新的b2实例时,这些调用会指向错误的实例,可能导致后续逻辑混乱。
分步修复方案
1. 修正ATM的start()方法和内部调用
把start()里的if __name__ == '__main__':去掉,确保调用start()时总能执行登录逻辑;同时把所有用b1调用方法的地方改成用self(指向当前实例):
def start(self): print("\t\t=== Welcome to ATM ===") inputpin = input("Enter your pin :") inputpass = input("Enter your password :") self.pinpasscheck(inputpin, inputpass) # 用self代替b1 def pinpasscheck(self,pin,passw): # ... 原有代码 ... if inputpass==userpass[index]: print("Login Succeeded !") flag= True self.operationlist(index) # 用self代替b1 # ... 原有代码 ... def operationlist(self,indexval): # ... 原有代码 ... elif useroption == 2: amount= int(input("\nEnter amount you want you want to withdraw : Rs")) self.withdraw(amount,index) # 用self代替b1 # ... 原有代码 ... def withdraw(self, amt, index): # ... 原有代码 ... print("Your remaining balance is: ", userbalance[index]) self.operationlist(index) # 用self代替b1
2. 调整ATM脚本的主程序入口
把原来ATM脚本末尾的实例创建和启动代码放到if __name__ == '__main__':下,这样只有单独运行ATM时才会自动启动,被导入时不会执行:
if __name__ == '__main__': b1 = Bank() b1.start()
3. 验证Virtual Doctor中的调用
现在在Virtual Doctor里调用b2.start(),就会正常弹出ATM的登录界面了。后续你可以在判断完疾病后,直接调用b2.withdraw(扣款金额, 用户索引)来实现购药金额扣除功能(记得要确保用户已经登录,拿到正确的用户索引)。
额外优化建议
- 把全局的
userpin、userpass、userbalance等数据改成Bank类的类属性,或者用字典存储(比如users = [{"pin": "1234", "pass": "1234", "name": "Rishabh", "balance": 20500}, ...]),这样更符合面向对象的设计,也避免全局变量带来的潜在问题。 - 如果不需要在Virtual Doctor里走完整的ATM操作流程,你可以给Bank类新增一个专门的扣款方法(比如
deduct_medication_fee(self, amount, index)),直接扣除金额而不进入操作菜单,提升用户体验。
内容的提问来源于stack exchange,提问作者Siddharth Joshi

