什么是反射 反射就是把字符串反射成内存对象。 反射,它可以把字符串映射到实例的变量或者实例的方法然后可以去执行调用、修改等操作。它有四个重要的方法: getattr 获取指定字
什么是反射
反射就是把字符串反射成内存对象。
反射,它可以把字符串映射到实例的变量或者实例的方法然后可以去执行调用、修改等操作。它有四个重要的方法:
- getattr 获取指定字符串名称的对象属性
- setattr 为对象设置一个对象
- hasattr 判断对象是否有对应的对象(字符串)
- delattr 删除指定属性
attr是属性英文的前几个字母,属性指的是类中类变量、实例变量和方法。但是要注意不能是私有的,如果你的变量是以“_”开头,那将无法获取。
1 class TestObj(object): 2 3 def __init__(self, name, age): 4 self.name = name 5 self.age = age 6 7 def displayName(self): 8 print("displayName方法执行,打印姓名:", self.name) 9 10 def AAA(self): 11 print("I am AAA.") 12 13 def main(): 14 to = TestObj("Tom", 23) 15 # 查看 to 实例里面是否有 name 这个属性 16 if hasattr(to, "name"): 17 print("实例 to 中有 name 属性。") 18 #得到to实例里面的name值 19 print(getattr(to, "name")) 20 else: 21 print("实例 to 中没有 name 属性。") 22 23 if hasattr(to, "AAA"): 24 print("实例 to 中有 AAA 属性,删除AAA属性。") 25 delattr(to, "AAA") 26 else: 27 print("实例 to 中没有 AAA 属性,AAA将会动态装载到实例里面去的。") 28 setattr(to, "AAA", AAA) # 参数:实例、方法名称、具体方法 相当于 to.AAA = AAA 第一个AAA是函数在实例中的名称, 第二个AAA是把哪个函数放进去,两者只是恰好这里名称一样
反射到底有什么用?
这就等于实现了动态加载和执行所需要的模块或方法而不需要全部写入到PY文件中,当然具体需要执行的方法你也要提前实现。典型的使用场景就是web的URL路由。目前所有的web框架的URL路由基本都是这个原理。