大家好,我是正在实战各种 AI 项目的程序员晚枫。
函数和类在 C 层面是什么结构?Python 的对象系统是如何工作的?这一讲,彻底搞懂 Python 万物皆对象的本质。
📖 开篇:一切皆对象
在 Python 中,函数、类、甚至类型本身都是对象:
1 | print(type(1)) # <class 'int'> |
这种「一切皆对象」的设计,让 Python 拥有了强大的元编程能力。
🔧 PyFunctionObject(函数对象)
函数在 C 层面的结构:
1 | // Include/funcobject.h |
验证函数对象
1 | def greet(name, greeting="Hello"): |
🏛️ PyTypeObject(类型对象)
type 本身也是一个类型,它的类型是 type:
1 | print(isinstance(int, type)) # True |
类型对象的核心结构
1 | typedef struct _typeobject { |
🔄 描述符协议(Descriptor)
描述符让属性访问可以被拦截:
1 | class ReadOnly: |
描述符的优先级
| 优先级(高到低) | 类型 |
|---|---|
| 数据描述符 | 实现了 get 和 set/delete |
| 实例属性 | 实例字典中的值 |
| 非数据描述符 | 只实现了 get |
| 类属性 | 类字典中的值 |
⚡ 元类(Metaclass)
元类是「类型的类型」:
1 | # type() 既可以创建对象,也可以创建类 |
自定义元类
1 | class Meta(type): |
💡 本节作业
- 用 inspect 模块查看任意函数的 code 属性
- 手写一个 ReadOnly 描述符,防止属性被修改
- 用 type() 函数(不用 class)创建一个带方法的类
🎯 本讲总结
PyFunctionObject:函数对象的 C 结构体,包含代码、全局命名空间、默认参数等。
PyTypeObject:类型对象的 C 结构体,定义了创建实例的所有行为。
描述符协议:get__、__set__、__delete 控制属性访问。
元类:「类型的类型」,type(name, bases, dict) 是元类的底层实现。
📚 推荐教材
《Python 编程从入门到实践(第 3 版)》 | 《流畅的 Python(第 2 版)》 | 《CPython 设计与实现》
🔗 课程导航
← 上一讲:容器类型实现 | 下一讲:栈帧与调用约定 →
💬 联系我
| 平台 | 账号/链接 |
|---|---|
| 微信 | 扫码加好友 |
| B 站 | Python 自动化办公社区 |
主营业务:AI 编程培训、企业内训、技术咨询