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

Python TypeError疑问:__init__参数不匹配及super()使用问题

问题原因与修复方案

报错核心原因

你的Science类构造方法__init__只声明了self这一个参数,但创建对象时传入了name, age, subject三个额外参数,Python找不到匹配的方法签名,直接抛出TypeError。

而不传参数时能运行,只是因为代码恰好调用了全局作用域里定义的name、age、subject变量,这属于巧合,完全不是面向对象的正确写法。

代码问题拆解

  1. 构造方法参数不匹配:
class Science(Student):
    def __init__(self):  # 仅接收self,未声明外部参数
        super().__init__(name, age,subject)

当你执行Science(name,age,subject)时,Python会尝试把三个参数传给__init__,但方法只接受self,参数数量不匹配直接触发错误。

  1. 全局变量误用:
    不传参数时,super().__init__(name, age,subject)里的变量来自全局定义,虽然能运行,但这种写法耦合性极强,破坏了类的封装特性,后续修改全局变量会直接影响类的行为。

修复后的代码

修改Science类的构造方法,明确接收参数并传递给父类:

class Student:
    def __init__(self, name, age, subject):
        self.name = name
        self.age = age
        self.subject = subject

    def subjchoosen(self):
        print("The subject choosen is", self.subject )

class Science(Student):
    def __init__(self, name, age, subject):  # 新增参数接收
        super().__init__(name, age, subject)
        self.subjchoosen()  # 直接调用自身方法,无需super()

name = "Test"
age = 12
subject = "Science"
Sc = Science(name, age, subject)

额外提示

  • 调用子类自身方法时,直接用self.方法名()即可,除非你特意要跳过子类实现去调用父类版本,否则不需要super()。
  • 类的构造方法应明确接收所需参数,避免依赖全局变量,保证类的独立性和可复用性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 21:15:41