You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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是带默认值的,但它后面的hpmana没有默认值——这会让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

顺便提下你代码里的其他小问题

  1. 实例化playerstats时参数传递错误:charcreation = playerstats('Tom', baselevel, self.chosenclass, self.chosenclass, basedmg, 0, basedef, 0)里,baselevelbasedmg是未定义的变量,而且self只能在类的方法内部使用,实例化时不能传self相关参数。正确实例化可以是:charcreation = playerstats('Tom', 80, 60, 15, 5)(默认值参数可省略)。
  2. 调用selectedclass方法的方式不对:应该用实例调用,比如charcreation.selectedclass('w'),而不是直接赋值self.chosenclass = 'w'
  3. 访问属性的方式错误:要访问实例属性得用实例对象,比如print(charcreation.hp),而不是print(playerstats.hp)(后者是访问类属性,你定义的是实例属性)。

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

火山引擎 最新活动