“Python 中一切皆对象”——这句话几乎是 Python 程序员的口头禅,但真正能深入讲清楚它背后机制的人并不多。下面带你彻底搞懂 Python 的对象模型,读完后你会明白为什么 3、None、function、class 甚至 type 本身都是对象。
一、核心结论(先记下来)
| 东西 | 在 Python 中是不是对象? | 它的类型是什么? | 谁创建了它? |
|---|---|---|---|
| 数字 3 | 是 | int | type 创建的实例 |
| 字符串 “hello” | 是 | str | type 创建的实例 |
| 函数 def f():… | 是 | function | type 创建的实例 |
| 类 class A:… | 是 | type(默认) | type 的实例(元类) |
| 模块(import math) | 是 | module | type 创建的实例 |
| None | 是 | NoneType | type 创建的实例 |
| type 本身 | 是 | type | type 是自己的实例! |
是的,type 自己也是对象,它是自己的实例,这才是 Python 对象模型的终极闭环。
二、Python 的三层对象模型(必须掌握的图)
┌──────────────┐
│ type │ ◄─────────────────┐
│ (元类,type本身) │
└──────┬───────┘ │
│ 创建 │
┌──────▼───────┐ │
│ 类对象 │ │
│ (如 int,str, │ │
│ list,自定义类) │
└──────┬───────┘ │
│ 创建 │
┌──────▼───────┐ │
│ 实例对象 │ │
│ (3,"hi",[1,2], │◄─────────────────┘
│ 你 new 出来的)
└──────────────┘
所有东西都是对象,所有对象都是某个类的实例,所有类(包括 type 自己)都是 type 的实例。
三、实战验证(直接在 Python 交互式环境敲)
>>> a = 42
>>> type(a) # a 是对象,它的类是 int
<class 'int'>
>>> type(int) # int 本身也是对象,它的类是 type
<class 'type'>
>>> type(type) # type 自己也是对象,它的类还是 type!
<class 'type'>
>>> def f(): pass
>>> type(f)
<class 'function'>
>>> type(f).__class__ # function 类的类也是 type
<class 'type'>
>>> import math
>>> type(math)
<class 'module'>
>>> type(math).__class__
<class 'type'>
>>> None.__class__
<class 'NoneType'>
>>> type(None)
<class 'NoneType'>
>>> type(NoneType) # NoneType 也是 type 创建的
<class 'type'>
四、类也是对象 → 可以赋值、传参、放进容器
>>> class Dog: pass
>>> my_class = Dog # 类就是对象,可以赋值
>>> d = my_class() # 用变量创建实例
>>> Dog in [list, str, Dog] # 可以放进列表
True
def create_obj(cls): # 把类当参数传
return cls()
>>> create_obj(list)
[]
这也是装饰器、工厂函数、Django 的模型系统能玩出花来的根本原因。
五、type 是终极元类:动态创建类
# 三种完全等价的写法
class A: pass
A = type('A', (), {})
def __init__(self, x): self.x = x
A = type('A', (), {'__init__': __init__, 'say': lambda self: print('hi')})
这就是框架(Django ORM、SQLAlchemy、pydantic 等)能在运行时动态生成类的底层原理。
六、对象头结构(底层 CPython 实现)
每个 Python 对象在内存中都有一个 PyObject 头(简化版):
typedef struct {
Py_ssize_t ob_refcnt; // 引用计数
PyTypeObject *ob_type; // 指向它的类型对象(这就是 type(a) 的来源)
} PyObject;
所有对象(包括 int、list、自定义类实例)都从这个结构开始,所以“一切皆对象”不是哲学,是真实内存布局。
七、常见误区澄清
| 误区 | 正确理解 |
|---|---|
| 基本类型不是对象 | 错!3 是 int 的实例,和自定义类实例没有任何本质区别 |
| 函数和类是“特殊”东西 | 不是,它们也是普通对象,只是类型分别是 function 和 type |
| type 不是对象 | 错!type 是一个对象,而且是自己的类(固定点) |
| 只能用 class 定义类 | 错!type() 才是底层真相,class 是语法糖 |
八、一张图记住 Python 对象模型(背会它)
+-------+
| type | ← type 是自己的实例(终极老板)
+-------+
↑
┌────────┴────────┐
| |
所有类(int,str,list,自定义类...)都是 type 的实例
↓ ↓
所有实例(3,"abc",[],你new的任何对象)都是某个类的实例
总结:真正理解“一切皆对象”后,你会发现
@classmethod、@staticmethod的本质变得清晰- 元类(metaclass)不再神秘
- 装饰器、工厂模式、Django models、pydantic 模型的底层原理一目了然
- 为什么
isinstance(3, int)和isinstance(3, object)都为 True(因为 int 继承了 object)
记住一句话:
在 Python 里,唯一“创造”东西的只有 type,其他所有东西(包括类和实例)都是 type 制造出来的对象。
这就是 Python 对象模型的终极真相。掌握它,你就真正掌握了 Python 的灵魂。