Python反射机制
目录
Python反射机制
1.Python反射机制
反射使得程序具有在运行时动态修改自己的结构和行为的能力,比如导入模块,调用函数等等,这些都是python的反射机制,是一种编程方法,设计模式的体现。
python的四个重要 内置函数: getattr、hasattr、delattr和setattr较为全面的实现了基于字符串的反射机制。他们都是对内存内的模块进行操作,并不会对源文件进行修改
内置函数:
- getattr(object,name[,default]) 通过name返回object的属性值,当属性不存在,将使用default 返回,如果没有default,则抛出AttributeError,name必须是字符串
- setattr(object,name,value) object的属性,则覆盖,不存在则新增
- hasaattr(object,name) 判断对象是否有这个名字的属性,name必须为字符串
2.getattr() 函数用于返回一个对象属性值
getattr(object, name[, default])
参数:
-object 对象
-name -字符串,对象属性
-default - 默认返回值,如果不提供该参数,在没有对应属性时,将触发 AttributeError
class A(object): bar = 1 def my_function(name): print('hello :', name) a = A() # 属性部分 print(getattr(A, 'bar')) # 1 反射有 print(getattr(A, 'bar0', 500)) # 没有bar0 变量名 返回 默认值结果 print(getattr(A, 'bar0')) # 不设置默认值 触发AttributeError # 函数部分 print(getattr(A,'my_function')('my_function')) # hello : my_function # None
这就是python的反射,它的核心本质其实就是利用字符串的形式去对象(模块)中操作(查找/获取/删除/添加)成员,一种基于字符串的时间驱动
3.hasattr 检查对象是否有某个属性
如果指定的对象拥有指定的属性,则 hasattr() 函数将返回True,否则返回False。
print(hasattr(A,'bar')) # True print(hasattr(A,'bar1')) # False print(hasattr(A,'my_function')) # True
4. setattr() 函数指定对象的指定属性的值
setattr(object, attribute, value)
参数信息:
- object 必须。 对象
- attribute 必需。您希望设置的属性的名称。
- value 必须。 需要。您要赋予指定属性的值
# 给对象 A 设置一个新的 age 属性 setattr(A,'age',40) print(getattr(A,'age')) # 40 # 修改对象 A 的 bar属性值 setattr(A,'bar',50) print(getattr(A,'bar')) # 50
5. delattr() 函数将从指定对象中删除指定属性
delattr(object, attribute)
参数信息:
- object 必须。 对象
- attribute 必须。 您希望删除属性的名称。
# 删除已有的属性值 print("删除之前", getattr(A, 'bar')) # 1 delattr(A,'bar') print("删除之后", getattr(A,'bar')) # AttributeError: type object 'A' has no attribute 'bar'
通过__import__
函数,我们实现了基于字符串的动态的模块导入。
最关键的是obj = __import__(modules)
这一行,它让程序去导入了modules
这个变量保存的字符串同名的模块,并将它赋值给obj
变量。
obj = __import__(路径 + modules, fromlist=True)
# 注意fromlist参数
本文的核心主题是如何利用字符串驱动不同的事件,比如导入模块、调用函数等等,这些都是python的反射机制,是一种编程方法、设计模式的体现,凝聚了高内聚、松耦合的编程思想,不能简单的用执行字符串来代替。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构