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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 23:24:02