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
相关产品推荐
相关产品推荐

