__init__ 初始化方法

下面讲python中, __init__ 在继承里最常见、最容易踩的坑

核心一句话

子类写了 __init__,就不会自动调用父类 __init__

父类的初始化代码不会自动跑,属性、逻辑都会丢。


坑 1:子类写了 init ,但没调用父类 init

错误代码

python 复制代码
class Animal:
    def __init__(self):
        print("父类初始化")
        self.age = 10  # 父类属性

class Dog(Animal):
    def __init__(self):
        print("子类初始化")
        # 这里没调用父类 __init__!

dog = Dog()
print(dog.age)  # 报错!AttributeError

为什么错?

  • 子类自己写了 __init__
  • Python 不会自动帮你调父类的 __init__
  • 所以 self.age 根本没被创建
  • 访问就报错

正确写法

python 复制代码
class Dog(Animal):
    def __init__(self):
        super().__init__()  # 手动调用父类初始化
        print("子类初始化")

坑 2:父类 init 需要参数,子类没传

错误代码

python 复制代码
class Animal:
    def __init__(self, age):
        self.age = age

class Dog(Animal):
    def __init__(self):
        super().__init__()  # 没传 age!

运行直接报错:
TypeError: __init__() missing 1 required positional argument: 'age'

正确写法

python 复制代码
class Dog(Animal):
    def __init__(self):
        super().__init__(10)  # 传参

坑 3:以为 super() 必须带类名和 self(老写法误区)

Python3 里下面两种完全一样:

python 复制代码
super().__init__()

# 老写法(Python2 遗留)
super(Dog, self).__init__()

你只需要记:
Python3 直接写 super().__init__() 就够了


坑 4:多继承时 super() 调用顺序混乱(菱形问题)

这个是最难、最容易懵的坑。

python 复制代码
class A:
    def __init__(self):
        print("A")

class B(A):
    def __init__(self):
        print("B")
        super().__init__()

class C(A):
    def __init__(self):
        print("C")
        super().__init__()

class D(B, C):
    def __init__(self):
        print("D")
        super().__init__()

d = D()

你以为执行顺序是:

D → B → A

D → C → A

实际输出:

复制代码
D
B
C
A

为什么?

因为 Python 多继承用 MRO 方法解析顺序
super() 不是"只调父类",而是按 MRO 链找下一个。

结论

多继承里 super() 行为很诡异,尽量少用多继承

这也是为什么设计原则说:优先组合,少用继承


坑 5:子类 init 里还没 super 就用父类属性

python 复制代码
class Animal:
    def __init__(self):
        self.age = 10

class Dog(Animal):
    def __init__(self):
        print(self.age)   # 报错!还没初始化
        super().__init__()

必须先调用 super().__init__(),才能用父类属性。


最核心总结(背这几句就够)

  1. 子类写 __init__,必须手动调用 super().__init__()
  2. 父类要参数,子类必须传
  3. 先 super(),再用父类属性
  4. 多继承 super() 顺序诡异 → 尽量不用多继承
  5. 子类不写 __init__ → 自动用父类的,不会踩坑

相关推荐
yuyuxun129 分钟前
协同过滤的校园二手物品智能推荐系统的设计与实现 毕业设计-附源码40082
javascript·vue.js·spring boot·python·数据分析·django·课程设计
如夏倾城1 小时前
百度文心(容易被忽略的好用AI)使用方式
人工智能·python·百度·语言模型·dubbo
用户019027581611 小时前
quotes 实时价和 klines 最新收盘价为什么对不上?
python
another heaven1 小时前
【C/C++ Ranges 是零开销抽象吗?拆开管道、惰性求值和编译期膨胀】
c语言·开发语言·c++
少司府2 小时前
嵌入式入门篇(二):初识STM32F103ZET6
linux·python·stm32·单片机·嵌入式硬件·mcu·嵌入式软件
打工仔折腾 AI3 小时前
Changedetection.io 网页变动监控:Docker 部署、通知配置与公网暴露实践
运维·人工智能·后端·python·docker·容器·性能优化
火云代理3 小时前
Python 使用代理 IP 前,先弄清 Requests 的配置来源与验证方法
网络·python·网络协议·tcp/ip·ip
SomeOtherTime3 小时前
Rust 闭包语法和原理(AI回答)
开发语言·后端·rust
apcipot_rain3 小时前
C++转Java日记(10)
java·开发语言
总要学点什么4 小时前
第105篇:三维特效-流动图片墙体效果——让箭头沿墙长滚,它俩竟是同一份代码
开发语言·javascript·ecmascript·gis·webgl·材质·cesium