所有 dunder name 官方统一统称 dunder names(缩写自 double underscore names),官方按使用场景+功能细分3大核心类别,覆盖所有内置 dunder,每个类别标注 官方英文名+核心示例+用途,无冗余纯干货,适配Python3.x 全版本,新手也能快速对应使用。
- 官方总称呼:dunder names(通用简称)、special names(官方全称,涵盖所有 xxx 形式标识符)
- 细分官方命名:按功能拆分2类专属官方名,是总分类下的精准叫法
- 特殊方法(类中带括号的 xxx()):special method names(官方核心叫法,最常用)
- 特殊属性(模块/类/实例中不带括号的 xxx):special attributes(官方精准叫法)
面向对象核心,占所有 dunder 的80%以上,分「特殊方法」「特殊属性」,仅作用于 类/实例 对象,是自定义类扩展内置行为的核心。
均为 def __xxx__(self,...): 格式,要么Python内置类型自带(如 list.add),要么可在自定义类中重写,实现内置语法行为(如运算、打印、初始化等)。
| 序号 | dunder 名称 | 官方关联说明 | 核心用途(通俗+精准) | 示例场景 |
|---|---|---|---|---|
| 1 | __init__ |
最基础的 special method | 实例初始化,创建对象时自动调用,初始化实例属性 | class A: def __init__(self, x): self.x = x |
| 2 | __str__ |
string representation method | 实例的「用户友好型字符串输出」,print(实例)/str(实例) 时调用 |
自定义打印实例的展示格式,返回普通字符串 |
| 3 | __repr__ |
official representation method | 实例的「官方/调试型字符串输出」,repr(实例)/终端直接输实例时调用 |
供开发者调试,要求返回可还原对象的字符串(官方推荐) |
| 4 | __add__ |
arithmetic special method | 加法运算符重载,实例1 + 实例2 时调用 |
让自定义类支持 + 运算,如自定义Point类实现坐标相加 |
| 5 | __sub__ |
arithmetic special method | 减法运算符重载,- 运算时调用 |
对应 -,用法同 __add__ |
| 6 | __mul__ |
arithmetic special method | 乘法运算符重载,* 运算时调用 |
对应 *,支持自定义乘法逻辑 |
| 7 | __getitem__ |
sequence/mapping special method | 下标取值重载,实例[索引] 时调用 |
让自定义类支持列表/字典式下标取值,适配序列/映射类型 |
| 8 | __len__ |
sequence special method | 长度获取重载,len(实例) 时调用 |
让自定义类支持 len() 函数,返回实例元素个数 |
| 9 | __eq__ |
comparison special method | 相等判断重载,== 运算时调用 |
自定义实例间的相等逻辑(默认比较内存地址,可重写为属性比较) |
| 10 | __ne__ |
comparison special method | 不相等判断重载,!= 运算时调用 |
对应 !=,搭配 __eq__ 使用 |
| 11 | __lt__ |
comparison special method | 小于判断重载,< 运算时调用 |
对应 <,实现实例间大小比较 |
| 12 | __gt__ |
comparison special method | 大于判断重载,> 运算时调用 |
对应 > |
| 13 | __enter__/__exit__ |
context manager special methods | 上下文管理器专用,with 实例 as var: 时自动调用 |
实现自动资源释放(如文件操作、连接关闭),成对出现 |
| 14 | __call__ |
callable special method | 让实例可被调用,实例() 时调用 |
把实例当作函数一样执行,拓展实例功能 |
| 15 | __del__ |
destructor special method | 实例析构函数,实例被垃圾回收时调用 | 释放实例占用的特殊资源(极少手动使用,Python自动回收为主) |
无需自定义,Python自动为类/实例生成,描述对象的元信息,仅可查询(部分只读),用于反射/自省(查看对象的底层信息)。
| dunder 名称 | 官方关联说明 | 核心用途 | 适用对象 |
|---|---|---|---|
__dict__ |
instance/class attribute dictionary | 存储实例/类的属性键值对,动态查看/修改属性 | 实例、类(模块也可使用) |
__class__ |
instance class reference | 查看实例所属的类(反向关联类对象) | 仅实例对象 |
__doc__ |
docstring attribute | 查看类/函数/模块的文档字符串("""...""" 定义的注释) | 类、函数、模块 |
__module__ |
class module origin attribute | 查看类定义所在的模块名 | 自定义类 |
__bases__ |
class base classes attribute | 查看类的所有父类(继承链),返回元组 | 仅类对象(适配继承场景) |
__annotations__ |
type annotation attribute | 存储类/函数的类型注解信息(如参数类型、返回值类型) | 类、函数 |
仅作用于Python模块(.py文件),属于 special attributes,不带括号,Python解释器运行模块时自动赋值,和面向对象无关,是模块的元状态标识。
| dunder 名称 | 官方英文名 | 核心用途(固定语义,永不改变) | 实用场景 |
|---|---|---|---|
__name__ |
module name attribute | 标识模块运行状态:直接运行→__main__,被导入→模块名 |
写模块入口逻辑(if __name__ == "__main__") |
__file__ |
module file path attribute | 返回模块的文件路径(相对/绝对路径,取决于运行方式) | 动态拼接文件路径(如读取同目录配置) |
__all__ |
module export list attribute | 手动定义,控制 from 模块 import * 时可导入的成员(变量/函数/类) |
模块,需手动赋值(非解释器自动生成) |
__package__ |
module package attribute | 标识模块所属的包名,无包则为None | 包内模块(工程化项目常用) |
作用于全局作用域或内置类型,多为解释器自动生成,隐性使用(日常用不到手动调用),但支撑Python底层运行,官方统称 special attributes。
| 类别 | dunder 名称 | 官方英文名 | 核心用途 | 使用场景 |
|---|---|---|---|---|
| 内置类型专属(special method names) | str.__add__/list.__len__ 等 |
built-in type special methods | 内置类型的底层行为实现,支撑普通语法操作 | 隐性调用,如 "a"+"b" 本质调用 str.__add__ |
| 解释器全局属性 | __builtins__ |
interpreter built-ins attribute | 存储所有内置函数/内置类型(如 print/int/list/dict) | 全局作用域,无需导入即可使用内置功能的底层支撑 |
| 解释器全局属性 | __debug__ |
interpreter debug mode attribute | 标识解释器是否以调试模式运行,默认True | 调试场景,判断是否执行调试代码 |
| 异常对象专属 | __cause__ |
exception cause attribute | 查看异常的直接原因 | 异常处理中,追溯异常根源 |
| 异常对象专属 | __traceback__ |
exception traceback attribute | 查看异常的回溯信息(报错堆栈) | 异常捕获时,定位报错位置 |
| 异常对象专属 | __msg__ |
exception message attribute | 存储异常的提示信息 | 所有异常实例,raise 异常("提示") 时赋值 |
- 所有 dunder 均遵循官方约定:前后双下划线固定格式,中间为小写英文,无下划线分隔(如
__init__非__init__); - 官方明确规定:
__xxx__格式为Python解释器/内置功能专属,开发者不可自定义无官方语义的 dunder(如__my_var__),避免和内置语义冲突; - 区分易混格式:单前双下划线(
__var)≠ dunder(__xxx__),前者是类的私有属性(名称改写),非官方定义的 dunder name; - 优先级:特殊方法(special method names)可自定义重写,特殊属性(special attributes)多为内置只读,不可随意修改。
- 带括号能重写 → 特殊方法(special method names)→ 类中拓展行为;
- 不带括号仅可查 → 特殊属性(special attributes)→ 模块/类/实例的元信息;
- 类里用、能重载 → 类相关 dunder;文件里、标状态 → 模块相关 dunder;底层撑、隐性用 → 全局/内置类型 dunder。