31.反射(getattr)
反射:
反射获取类中变量和方法:
用字符串类型的名字去获取变量,经常用来操作内存中已经存在的变量
class Teacher: dic={'学生':'','教师':''} @classmethod def show_info(cls): print('show_info') ret=getattr(Teacher,'dic') #通过变量名的字符串形式取到返回值 print(ret) fun=getattr(Teacher,'show_info') #指定的是一个方法,返回一个地址 fun() #加上()调用该方法 t=Teacher() print(getattr(t,'dic'))
执行结果:
{'学生': '', '教师': ''}
show_info
{'学生': '', '教师': ''}
从代码可以看出,getattr可以返回指定的对象或类的属性,没有的话报错,可以添加第3个参数,设置没有相应的属性时的返回值;如果寻找的是一个方法,即第二个参数是一个方法名,就返回一个地址,名字后面加上()就可以调用了
hasattr可以判断指定的对象或类是否由某个属性,有就返回True,没有返回False
setattr设置一个变量,setattr(A,'属性名','属性值') 给类A设置一个属性=属性值
如 setattr(a,'属性名','属性值') 给对象a设置一个属性=属性值
delattr删除一个变量 delattr(a,'属性名') 将对象a的指定属性删除
如 delattr(A,'属性名') 将对类A的指定属性删除
hasattr经常与getattr两个配合使用
class Teacher: dic={'学生':'show_stu_info','教师':'show_tea_info'} def show_stu_info(cls): print('返回学生个人信息') def show_tea_info(cls): print('返回教师个人信息') alex=Teacher() for i in Teacher.dic: print(i) c=input('输入想要查看谁的信息:') func=getattr(alex,Teacher.dic[c]) ###根据用户输入返回的字典值来查找函数 func()
getattr的使用场所,可以根据用户的输入,返回字典的值,这个值是一个字符串类型的函数名,使用getattr来查找该方法,允许返回的方法地址。
反射获取导入的模块中的属性和方法:
以反射的形式来获取导入的模块中的属性和方法,用法是相同的 操作方法:getattr(模块名,'属性名或函数名')
如,反射导入模块中的day变量
import my print(getattr(my,'day'))
反射获取自己文件中的属性和方法:
反射自己文件中的变量和属性(非面向对象代吗) 操作方法:getattr(sys.modules[__name__],'属性名或方法名')
import sys # sys.modules[__name__] 此段代码可以找到__main__,即使是被引入到别的函数中使用 def hello(): print("你好") getattr(sys.modules[__name__],'hello')() #反射自己文件中的函数hello
反射的方法有参数:
在以上的反射中,反射的方法都是没有参数的,因此碰到带有参数的方法,反射方法如下:
将参数写在正常代码后即可
import time c=getattr(time,'strftime')('%Y-%m-%d %H:%M:S') #反射函数打印时间,可间参数字节写在反射后的()中 print(c)
执行结果:
2020-10-24 21:25:17
反射一个模块中的类:
getattr(模块名,'类名') #得到一个模块中的类
a=getattr(模块名,'类名')() #得到一个模块中的类,并将该类实例化

浙公网安备 33010602011771号