super() 在 Python 3 中自动推导 class 和 self,无需显式传参;其绑定依赖当前执行栈,脱离方法体调用会失效,多继承中遗漏 super() 将中断 MRO 初始化。

因为 super() 内部已经绑定了当前调用上下文,self 是隐式可用的,不是“省略了”,而是根本不需要你传。
super() 返回的是一个绑定代理对象,不是普通类名
调用 super() 时,Python 会根据当前函数的执行栈(具体是 frame.f_locals 中的 self 和当前类)自动推导出两个关键信息:__class__(当前类)和 self(当前实例)。这个过程在 CPython 解释器层面完成,所以你在代码里看不到 self,但它始终在场。
-
super()在 Python 3 中等价于super(__class__, self),而__class__是函数运行时动态确定的,不是写死的类名 - 如果你手动写
super(Child, self),和super()行为完全一致;但反过来,写super(Child, None)会报RuntimeError: super(): __class__ cell not found - 这个机制只在实例方法或类方法中有效;在静态方法、模块顶层或 lambda 里直接调用
super()会失败
为什么显式传 self 在 Python 2 里是必须的?
Python 2 的 super() 不具备运行时推导能力,它只是一个普通函数,必须靠你明确告诉它“当前类是谁、当前实例是谁”。所以语法强制为 super(Child, self)。一旦漏掉 self,就只剩一个类对象,无法做实例方法分发。
让 macOS 自动化像说话一样简单 —— 用代码控制你的 Mac,无需学习 AppleScript 系统要求 macOS 14+ (Sonoma) Python 3.9+ 需要开启:辅助功能 + 屏幕录制权限
- Python 2 中
super(Child, self).method()→ 正确:代理对象知道怎么把method()绑定到self - Python 2 中
super(Child, None).method()→ 报错:AttributeError: 'super' object has no attribute 'method' - Python 3 中哪怕你在装饰器里误用了
super()(比如没在方法体内),错误信息也更明确:RuntimeError: super(): no arguments
容易踩的坑:你以为没传 self,其实它早被绑死了
最典型的误用是把 super() 拿去赋值或延迟调用,比如存成变量、放进列表、或者在闭包里返回——这些操作会破坏其绑定上下文,导致后续调用失败或行为异常。
- ❌ 错误:
sup = super(); sup.__init__(x)——sup已脱离当前帧,__class__和self丢失 - ✅ 正确:
super().__init__(x)必须直接调用,不能中间转手 - ⚠️ 多继承下尤其危险:如果某个父类的
__init__没写super().__init__(),MRO 链就断在那儿,后面的类(哪怕是 object)都不会初始化 —— 这和你传不传self无关,但常被误认为是super()的参数问题
真正关键的不是“要不要写 self”,而是理解 super() 的调用必须发生在方法执行现场;一旦离开那个栈帧,它就什么都不是了。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










