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

疑惑:在类中定义__init__是否真的重写了object类的__init__方法?

子类定义带参数的__init__算不算重写object的__init__?

结论很明确:算。Python里的方法重写规则和Java这类静态语言不一样,不强制要求方法签名完全一致,只要方法名相同,子类的方法就会覆盖父类的对应方法。

为啥签名不一样也能重写?

Python是动态类型语言,方法重写看的是方法名匹配,不是参数列表:

  • object的__init__签名是def __init__(self):(无额外参数)
  • 你写的Child.__init__是def __init__(self, age):(多了age参数)

但只要你实例化Child(比如kid = Child(18)),Python会直接调用子类的__init__,完全不会触发object的版本——这就是重写的核心表现,和签名一致不一致没关系。

你代码里的小bug

你代码里的比较逻辑错了:signature(Child.__init__) == object.__init__是把Child.__init__的签名对象和object.__init__这个方法本身比,结果肯定是False。正确的对比应该是拿两者的签名对象比:

from inspect import signature
class Child:
    def __init__(self, age):
        self.age = age
print(signature(Child.__init__) == signature(object.__init__))  # 输出False,确实签名不同

额外提醒:签名不一致的坑

虽然Python允许这么做,但如果你的子类需要通过super()调用父类的__init__,最好给子类的__init__加上可变参数,兼容父类的参数要求:

class Child:
    def __init__(self, age, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.age = age

这样就算父类(比如后续你改继承其他类)的__init__有参数变化,子类也不会报错。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 08:42:01