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

相关推荐
2301_812539679 小时前
Tailwind CSS如何设置不同断点的内边距_使用p-4 md-p-8类.txt
jvm·数据库·python
m0_596749099 小时前
CSS实现动态悬浮菜单位置_JS计算配合CSS绝对定位
jvm·数据库·python
书源丶9 小时前
四十五、函数式接口与 Lambda 表达式
java·开发语言
2301_8125396710 小时前
golang如何实现最小堆定时器_golang最小堆定时器实现总结
jvm·数据库·python
java1234_小锋10 小时前
Java进程突然挂了如何排查?
java·开发语言
lyc878010 小时前
【Qwen3.5-2B-Base】本地模型部署和验证联动千帆api
大数据·python
m0_6908258210 小时前
检测三位随机数中重复数字的Python实现方法
jvm·数据库·python
谙弆悕博士10 小时前
GPT-5.5 Instant 免费开放背后的技术跃迁与战略阳谋
人工智能·python·gpt·chatgpt·学习方法·业界资讯
WL_Aurora10 小时前
备战蓝桥杯国赛【Day 6】
python·算法·蓝桥杯
阿正呀10 小时前
Redis如何处理数据持久化与主从切换的冲突_确保选主期间的数据安全落盘.txt
jvm·数据库·python