疑惑:在类中定义__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
相关产品推荐
相关产品推荐

