Python 反射技术!运行时动态操作属性方法,很多人听过但不会用 前言很多新手第一次听到 “反射”感觉是很高深的名词。 其实在 Python 里反射没有那么玄乎程序已经跑起来之后动态去探查、读写、调用对象的属性或者方法而不是在写代码的时候全部写死。在 FastAPI、插件化开发、配置驱动、动态调度函数场景经常用到。 比如根据配置字符串自动调用对应的处理函数不用写一大堆 if/elif 判断代码扩展性直接拉满。 反射核心 4 个内置函数hasattr、getattr、setattr、delattr下面逐个讲解。说明Python 反射是基于对象的属性字典__dict__实现的下面所有示例可以直接复制运行。一、准备演示类我们先定义一个简单的类用来做后续所有测试class Student: def __init__(self, name, age): self.name name self.age age def say_hello(self): print(f你好我是{self.name}) stu Student(小明, 18)1. hasattr (obj, name)判断对象是否存在属性 / 方法作用检查对象 obj 里面是否存在名为name的属性或者方法返回布尔值 True/False。name 是字符串这个是新手最容易忘的点引号不能丢。# 判断有没有name属性 print(hasattr(stu, name)) # True # 判断有没有say_hello方法 print(hasattr(stu, say_hello)) # True # 判断不存在的属性 print(hasattr(stu, score)) # False✅实战场景使用 getattr 之前先用 hasattr 判断防止抛出异常。2. getattr (obj, name, defaultNone)获取属性或者方法获取对象的属性或者方法。如果属性不存在不写 default 会直接抛AttributeError设置 default 的时候找不到就返回默认值。获取属性值name getattr(stu, name) print(name) # 小明 # 属性不存在返回默认值None score getattr(stu, score, 0) print(score) #0获取方法并且动态调用这是反射最常用的能力func getattr(stu, say_hello) # 拿到方法对象然后执行 func()重点我们只是传字符串say_hello程序运行的时候才去找这个方法不是写死调用stu.say_hello()。这就是反射的魅力。##3. setattr (obj, name, value)动态添加 / 修改属性 给对象动态设置属性。如果属性原本就存在则覆盖不存在就新增。# 修改已有属性 setattr(stu, age, 20) print(stu.age) # 动态新增属性 setattr(stu, score, 95) print(stu.score) # 甚至可以动态添加新方法 def new_func(): print(动态新增的方法) setattr(stu, test_func, new_func) stu.test_func()##4. delattr (obj, name)删除对象属性 动态删除对象上的属性。如果属性不存在抛出 AttributeError。# 删除score属性 delattr(stu, score) print(hasattr(stu, score)) #False注意delattr 只能删实例属性不能随便删除类里面定义的方法谨慎使用综合实战示例插件思路去掉大量 if 判断假设根据配置里的字符串自动执行对应函数。不用写一堆 if elifclass Calc: def add(self,a,b): return ab def sub(self,a,b): return a-b c Calc() op add # 这个字符串可以从配置/前端传过来 if hasattr(c, op): fn getattr(c, op) res fn(10, 3) print(res)如果以后新增乘法 mul 函数只需要在类里面增加方法不用修改判断逻辑代码更符合开闭原则。新手高频踩坑点❌坑 1名字不加引号。hasattr(stu, name)这里 name 是变量不是字符串很容易搞错。hasattr(stu, name)才是检查 name 属性。❌坑 2拿到方法忘记调用。func getattr(stu, say_hello)此时只是拿到函数对象必须加()执行func()。❌坑 3滥用反射。反射会降低代码可读性IDE 无法提示属性代码不好维护。简单场景优先直接调用不要为了炫技强行上反射。❌坑 4不要用反射执行外部不可信的输入。如果字符串来自前端用户输入恶意用户可能调用危险方法造成安全漏洞答辩口述小抄直接背问什么是 Python 反射四个内置函数分别是什么 答Python 反射指在程序运行阶段动态探测、获取、修改对象的属性和方法而不是编码阶段写死调用。四个核心函数hasattr 用来判断是否存在getattr 获取属性或方法setattr 动态新增或者修改属性delattr 删除属性。反射适合插件化、配置驱动开发但要注意安全问题不建议接收用户输入直接反射调用。总结一句话记住hasattr 查有没有getattr 拿出来setattr 去新增delattr 做删除名字都是字符串运行动态来操作。