__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__ → 自动用父类的,不会踩坑

相关推荐
昵称画1 小时前
交接班记录电子化:三班之间的信息不漏
开发语言·数据库·人工智能·低代码·php
“AI国潮设计-小江”1 小时前
【AIGC实战】Python+SDXL批量生成“潮汕英歌舞不倒翁”IP | 角色一致性与多场景融合方案,附完整代码
开发语言·人工智能·python·prompt·aigc
传奇开心果编程1 小时前
【Rust入门练中学】第6课:结构体与方法
开发语言·rust·结构体·编程语言理论·结构体方法·编程通用语言
Linux_cy1 小时前
服务器管理工具哪个好用?我用了七八个
运维·服务器·javascript·python·ssh·面板·gmssh
MoRanzhi12032 小时前
第6篇(下)· 使用 PyQt5 实现 2048 高性能计算版:统一运行控制与跨模式安全交接
python·pyqt·进程管理·状态机·软件架构·并发控制·数据一致性
code tsunami2 小时前
【无标题】
开发语言·python
CodeGL2 小时前
10、Python基础之进程和线程
开发语言·python
TechWayfarer3 小时前
PHP漏洞被利用,怎么揪出攻击IP?
开发语言·python·tcp/ip·网络安全·php
2601_967980114 小时前
Python列表操作方法详解
python·数据类型·修改·列表操作·功能汇总
卡卡~~5 小时前
“101计划”核心课程实践教材《数据实验结构指导-C++语言版》题目集
开发语言·c++·学习·算法