Python类实例化报错:__init__() takes exactly 2 arguments (3 given)求助
看起来你遇到的这个错误有点“矛盾”——从你贴的代码来看,Player类的__init__明明定义了接受Pos和Stack两个参数(加上self一共3个),但Python却提示你传了3个参数而方法只接受2个。这大概率是模块缓存或者代码未保存的问题,下面是具体的排查和解决步骤:
可能的原因及解决方法
1. 代码未保存或加载的是旧版本的类
这是最常见的原因:你修改了Player.py里的__init__方法,但没有保存文件,或者你的Python解释器还在使用之前缓存的旧版本类(比如旧版本的__init__只有self一个参数)。
解决步骤:
- 关闭当前运行Python的终端/IDE,重新打开。
- 确认
Player.py的代码确实保存为你贴出来的版本,尤其是__init__方法的参数部分:class Player(object): def __init__(self, Pos, Stack): self.Pos = Pos self.Stack = Stack def cstack(self, change): self.Stack += change
2. Python模块缓存问题
Python会缓存已经导入的模块,避免重复加载。如果你之前运行过旧版本的Player类,即使修改了文件,当前的解释器会话可能还是会用旧的版本。
解决方法:
如果是在交互式环境(比如IPython或者Python shell)里,可以重新加载模块:
- Python 3:
from Player import Player import importlib importlib.reload(Player) # 重新加载模块 Player1 = Player(0, 500) # 现在应该可以正常创建实例了 - Python 2:
from Player import Player reload(Player) Player1 = Player(0, 500)
3. 检查是否有同名模块干扰
确保你的项目文件夹里只有一个Player.py文件,没有其他同名的文件(比如player.py,注意Python在Windows下文件名不区分大小写,但在Linux/macOS下区分,可能导致导入错误的文件)。同时确认Go.py和Player.py在同一个目录下,或者Player.py在Python的搜索路径里。
验证方法
你可以在Go.py里添加一行代码,打印Player类的__init__方法,确认它的参数是否正确:
from Player import Player print(Player.__init__)
如果输出显示类似<function Player.__init__ at 0x...>,并且函数签名包含__init__(self, Pos, Stack),那说明导入的是正确的类,此时再创建实例就不会报错了。
内容的提问来源于stack exchange,提问作者Federico Davide

