Python开发问答游戏调用类方法时self未定义报错的原因是什么
报错直接原因
self 是Python类实例方法的内部专属关键字,仅能在类定义的方法内部使用,代表当前调用方法的实例对象。你在全局作用域调用que1.lay(self.opt2)时,全局环境根本没有定义名为self的变量,自然会触发未定义报错。如果要传入que1的opt2作为正确答案,直接写que1.lay(que1.opt2)即可解决当前报错。
隐藏逻辑问题
就算你改了调用写法,代码还是无法正常判分,你lay方法内的判断逻辑存在错误:
- 你传入的
correct_opt参数本身是正确答案的内容,但是后续代码中你把用户选择的选项内容赋值给了correct_opt,直接覆盖了传入的正确值 - 最后你拿被覆盖后的
correct_opt(内容是选项文本)和用户输入的ans(内容是a/b/c/d的字母)做相等判断,永远不可能成立,所有作答都会被判错。
优化后可正常运行的代码
print('Welcome to quiz game !!\n') score = 0 class templet: # 增加初始化方法统一管理问题、选项、正确答案,代码更规范易维护 def __init__(self, que, opt1, opt2, opt3, opt4, correct_opt): self.que = que self.opt1 = opt1 self.opt2 = opt2 self.opt3 = opt3 self.opt4 = opt4 self.correct_opt = correct_opt def lay(self): print(self.que) print('a)', self.opt1) print('b)', self.opt2) print('c)', self.opt3) print('d)', self.opt4) ans = input('\nInput your answer: ').strip() user_choose = None if ans == 'a': user_choose = self.opt1 elif ans == 'b': user_choose = self.opt2 elif ans == 'c': user_choose = self.opt3 elif ans == 'd': user_choose = self.opt4 else: print('\nEnter a valid value') return if user_choose == self.correct_opt: print('Yay! you answered it correct') global score score += 1 else: print('ooh !! you answered it incorrect') que1 = templet( que='What does CPU stand for ?\n', opt1='Central Power Unit', opt2='Central Processing Unit', opt3='Centralized Power Unit', opt4='Centralized Processing Unit', correct_opt='Central Processing Unit' ) que2 = templet( que='What does GPU stand for', opt1='Graphic Processing Unit', opt2='Graphical Processing Unit', opt3='Graphic Power Unit', opt4='Graphical Power Unit', correct_opt='Graphics Processing Unit' ) que1.lay() que2.lay() print(f"\nYour final score is: {score}/2")
内容的提问来源于stack exchange,提问作者SJ0
相关产品推荐
相关产品推荐

