Python反射是程序运行时动态获取对象信息、调用方法或修改属性的能力,通过getattr、setattr、hasattr、dir等内置函数实现,适用于序列化、命令分发、测试调试和ORM映射等场景。

什么是Python反射
Python反射是指在程序运行时动态获取对象信息、调用方法或修改属性的能力。它不依赖编译期的类型声明,而是通过内置函数如 getattr、setattr、hasattr 和 dir 等,在运行中检查和操作对象。
常用反射函数怎么用
这些函数是反射操作的核心,日常使用频率高,语义清晰:
- getattr(obj, name[, default]):获取对象指定属性或方法。如果属性不存在且未提供 default,则抛出 AttributeError
- setattr(obj, name, value):为对象设置(或创建)属性。支持动态添加实例变量或覆盖已有值
- hasattr(obj, name):判断对象是否含有某属性或方法,返回布尔值,内部其实调用了 getattr 并捕获异常
- dir(obj):返回对象所有可访问的属性和方法名列表(包括继承的),适合调试或探索未知对象结构
用反射调用方法和处理未知类
当面对外部模块导入的类、配置驱动的逻辑,或插件式架构时,反射能避免硬编码判断:
- 假设有一个字符串 "process_data",想调用某个对象的同名方法: getattr(obj, "process_data")()
- 若方法需要参数,可继续传入: getattr(obj, "validate")(user_input)
- 配合 isinstance 或 callable 可做安全调用:先用 hasattr 检查,再用 callable 判断是否为方法而非普通属性
反射的典型应用场景
反射不是炫技工具,而是在特定场景下提升灵活性的关键手段:
立即学习“Python免费学习笔记(深入)”;
- 序列化/反序列化:将字典字段自动映射到对象属性,用 setattr 批量赋值
- 命令行工具分发:根据用户输入的子命令字符串,反射调用对应处理函数
- 测试与调试辅助:遍历对象所有方法并统一打日志、加计时装饰器
- ORM 字段映射:模型类通过反射读取字段定义,生成 SQL 查询语句










