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

Python继承中super().__init__传参报错疑问及多变量传参咨询

问题疑问

为什么调用super().__init__时,必须直接传入字符串形式的level参数(比如level="primary"),而不能用带默认字符串值的变量?如果有多个这类固定值的参数需要传入父类构造方法,该怎么处理?

报错相关代码

class School:
  def __init__(self, name, level, numofs):
    self.name = name
    self.level = level
    self.numofs = numofs
  
  def get_name(self):
    return self.name
  def get_level(self):
    return self.level
  def get_numbofs(self):
    return self.numofs
  
  def set_numofs(self, num):
    self.numofs = num
  
  def __repr__(self):
    return "A {} school named {} with {} students".format(self.level , self.name, str(self.numofs))
hamilton = School("hamilton", "high", 16)
print(hamilton.get_name())
print(hamilton)
class PrimarySchool(School):
  def __init__(self, name, numofs, ptime):
    super().__init__(self, name, numofs, level = "primary")
    self.ptime = ptime
  def get_time(self):
    return self.ptime
  def __repr__(self):
    old = super().__repr__()
    return old + "the pickup policy is {}".format(ptime)
turtle = PrimarySchool("turtle", 16, "late pick-up")

问题解答

先纠正你代码里的核心错误

你报错的根本原因不是“用变量传参不行”,而是调用super().__init__时犯了两个低级错误:

  1. 多传了self参数:Python中用super()调用父类方法时,不需要手动传递self,它会自动绑定当前实例。
  2. 参数顺序不匹配:父类School的构造方法参数顺序是name, level, numofs,但你子类里把numofs放在了level的位置,又用关键字参数补level,导致参数数量和顺序完全混乱。

关于“能不能用变量传固定值”的问题

完全可以用变量传,根本不存在“必须直接传字符串”的限制。比如把代码改成这样就正常运行:

class PrimarySchool(School):
    def __init__(self, name, numofs, ptime):
        # 先定义变量存固定值
        school_level = "primary"
        # 按父类参数顺序传,不用加self
        super().__init__(name, school_level, numofs)
        self.ptime = ptime
    
    def get_time(self):
        return self.ptime
    
    def __repr__(self):
        old = super().__repr__()
        # 要加self.才能访问实例属性ptime
        return old + ",接送规则是{}".format(self.ptime)

多个固定参数的处理方式

如果父类有多个需要固定值的参数,比如新增一个school_type参数,子类固定为“公立”,两种写法都可以:

写法1:直接在调用时传固定值

super().__init__(name, "primary", numofs, "公立")

写法2:先定义变量再传

level = "primary"
school_type = "公立"
super().__init__(name, level, numofs, school_type)

两种方式效果完全一致,选哪种取决于代码可读性需求——如果固定值需要复用或者语义更清晰,就用变量;如果是简单的常量,直接传也没问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 06:12:33