Python3类语法错误:默认参数后接非默认参数问题求助
理解Python的"non-default argument follows default argument"错误
这个错误其实是Python参数定义的基础规则被打破了,咱们先聚焦你代码里出错的那行:
def __init__(self, name, baselevel=1, hp, mana, basedmg=0, atkdmg, basedef=0, chardef):
错误核心原因
Python有个硬性规则:函数定义中,带有默认值的参数必须放在没有默认值的参数之后。
为什么要这么规定?因为当你调用函数时,如果混合使用位置参数和默认参数,解释器需要明确对应关系。比如你这里baselevel=1是带默认值的,但它后面的hp、mana没有默认值——这会让Python彻底困惑:如果我不传baselevel的值,那后面的hp到底是对应第二个位置参数(原本的baselevel)还是第三个?
举个极简的错误示例:
def func(a=1, b): # 错误:带默认值的a在无默认值的b前面 pass
对应的正确写法:
def func(b, a=1): # 正确:无默认值参数在前,默认参数在后 pass
针对你代码的修正建议
把所有没有默认值的参数(name, hp, mana, atkdmg, chardef)移到带默认值的参数(baselevel=1, basedmg=0, basedef=0)前面,修改后的__init__应该是这样:
def __init__(self, name, hp, mana, atkdmg, chardef, baselevel=1, basedmg=0, basedef=0): self.name = name self.baselevel = baselevel self.hp = hp self.mana = mana self.basedmg = basedmg self.atkdmg = atkdmg self.basedef = basedef self.chardef = chardef # 补充:__init__方法不需要return值,它的作用是初始化实例,默认返回None
顺便提下你代码里的其他小问题
- 实例化
playerstats时参数传递错误:charcreation = playerstats('Tom', baselevel, self.chosenclass, self.chosenclass, basedmg, 0, basedef, 0)里,baselevel、basedmg是未定义的变量,而且self只能在类的方法内部使用,实例化时不能传self相关参数。正确实例化可以是:charcreation = playerstats('Tom', 80, 60, 15, 5)(默认值参数可省略)。 - 调用
selectedclass方法的方式不对:应该用实例调用,比如charcreation.selectedclass('w'),而不是直接赋值self.chosenclass = 'w'。 - 访问属性的方式错误:要访问实例属性得用实例对象,比如
print(charcreation.hp),而不是print(playerstats.hp)(后者是访问类属性,你定义的是实例属性)。
内容的提问来源于stack exchange,提问作者esteel




