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__时犯了两个低级错误:
- 多传了
self参数:Python中用super()调用父类方法时,不需要手动传递self,它会自动绑定当前实例。 - 参数顺序不匹配:父类
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
相关产品推荐
相关产品推荐

