Python 反射
什么是反射Reflection一句话大白话反射 用字符串的名字去操作对象的属性和方法。正常写代码obj.name obj.say()反射写代码getattr(obj, name) getattr(obj, say)()再直白一点程序运行时不知道对象有什么属性、方法但我拿到一个字符串名字就能动态获取、修改、调用它。这就叫反射。为什么要叫 “反射”对象就像站在你面前的人。你不用直接碰他而是通过 “名字字符串” 这个镜子照到他内部的属性和方法然后操作。镜子 字符串照到内部 获取 / 修改 / 调用这就是反射。三、反射三剑客核心必须背下来Python 反射只有3 个内置函数全部操作对象1. hasattr →有没有判断对象是否包含某个属性 / 方法返回 True / Falsehasattr(obj, 属性名字符串)例子class User: name 张三 u User() print(hasattr(u, name)) # True print(hasattr(u, age)) # False2. getattr →拿值通过字符串名字获取属性的值或获取方法getattr(obj, 属性名) getattr(obj, 属性名, 默认值) # 没有就返回默认值不报错例子name getattr(u, name) # 获取 name 属性 print(name) # 张三 age getattr(u, age, 0) # 没有 age返回 0调用方法func getattr(u, say) func() # 调用方法3. setattr →赋值通过字符串名字设置 / 修改属性的值setattr(obj, 属性名字符串, 新值)例子setattr(u, name, 李四) print(u.name) # 李四四、三剑客一起用最经典写法# 1. 先判断有没有 if hasattr(obj, target): # 2. 有就拿出来 val getattr(obj, target) # 3. 想改就改 setattr(obj, target, val 1)五、反射到底有什么用你必须知道1. 动态处理代码更灵活不知道属性名是什么从配置、接口、用户输入里拿到字符串照样能操作。2. 框架底层必用asyncio、Django、Flask、爬虫、ORM 全靠它比如根据路由字符串调用对应函数事件循环根据事件名调用回调消息处理根据类型调用处理方法3. 代码不报错更健壮不用obj.xxx怕不存在报错用getattr(obj, xxx, 默认)安全无比。六、超级简单示例一看就懂class Student: def __init__(self): self.name 小明 self.age 18 def study(self): print(学习中) s Student() # 反射开始 # 1. 判断 print(hasattr(s, name)) # True # 2. 获取 print(getattr(s, name)) # 小明 # 3. 修改 setattr(s, age, 20) print(s.age) # 20 # 4. 调用方法 func getattr(s, study) func() # 学习中七、终极总结背这 4 行就够反射 用字符串操作对象属性 / 方法hasattr判断有没有getattr获取值 / 方法setattr设置值