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

Python类内创建线程遇self相关报错问题求助

问题分析与解决

你的代码存在几个关键问题,逐个修正即可解决线程运行的问题:

  • 类方法缺失self参数:run_level方法没有定义self参数,但内部调用了self.level(),必须把方法定义改为def run_level(self):。
  • 线程定义位置错误:把t1 = threading.Thread(...)放在类的顶层,此时还未创建类的实例,self根本不存在。应该把线程创建放在类的实例方法中,比如初始化方法__init__或者专门的启动方法里。
  • Thread的target参数传值错误:target需要传入函数对象,不能加括号(加括号会直接执行函数,而非让线程去执行),正确写法是target=self.run_game。
  • 语法错误:run_level里的while True;用了分号,应改成冒号while True:。

修正后的完整代码:

import threading

class Pong:  # 遵循PEP8规范,类名用大驼峰命名
    def __init__(self):
        # 在初始化方法中创建线程对象
        self.game_thread = threading.Thread(target=self.run_game)
        self.level_thread = threading.Thread(target=self.run_level)

    def run_game(self):
        while True:
            self.bounce()
            self.run_ball()
            # 其他游戏逻辑

    def run_level(self):
        while True:  # 修正分号为冒号
            self.level()

    # 补充示例空方法,避免运行报错
    def bounce(self):
        pass
    def run_ball(self):
        pass
    def level(self):
        pass

# 类的使用示例
if __name__ == "__main__":
    pong_game = Pong()
    pong_game.game_thread.start()  # 启动游戏线程
    pong_game.level_thread.start()  # 启动关卡线程
    # 若需等待线程结束,可调用join()
    # pong_game.game_thread.join()
    # pong_game.level_thread.join()

额外说明:

  • 必须导入threading模块,否则无法创建线程。
  • 启动线程必须调用start()方法,仅创建线程对象不会自动执行线程逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 08:43:21