1.反射
1)神赐给你的内置函数 :
a: getattr(命名空间,'函数名') == 命名空间.属性名; 这里的命名空间指的是对象或者类;
b: getattr四个应用场景:
1)类名.名字 <==> getattr(类名,'名字')
2)对象名.名字 <==> getattr(对象名,'名字')
3)模块名.名字 <==> getattr(模块名,'名字')
4)自己文件名.名字 <==> getattr(自己文件名,'名字')
c:getattr的天命圈
**getattr(命名空间,'函数名',默认值参数)这个默认值参数就很强大,getattr会先找指定成员,如果存在
则返回成员引用,否则返回默认值参数;但是你如果不传默认值参数,如果找不到会报错(它与hasttr异常处理的区别见下边解释)
所以总结来说,getattr就是把你用小数点调用的方式转换为getattr(命名空间,‘静态变量名/动态变量名)
2)hasattr():
a:功能指定对象中是否含有指定成员,有则返回True,否则返回False;
b:格式:hasattr(指定对象空间,变量名)
c:异常处理时与hasattr的区别:
imp = input('>>>:') imp_module = __import__(imp) while 1: fun_name = input('>>>:') func = getattr(imp_module,fun_name,True) #如果找不到,则返回默认参数 if func == True: #对找不到的情况处理 print('重新输入!') continue else: a = func() print(a) imp = input('>>>:') imp_module = __import__(imp) while 1: fun_name = input('>>>:') ret = hasattr(imp_module, fun_name) #查看指定对象里的情况,如果没有返回False if ret == True: #对找不到的情况处理 func = getattr(imp_module,fun_name) a = func() print(len(a)) else: print('重新输入!') continue
第一段程序是利用默认值 第二段是利用hasattr(后者是对指定对象空间处理,比较精准)
3)setattr():
a: 功能:给指定对象添加指定成员
b:格式:setattr(对象空间,要改的变量名,新值)
4)delattr()
a:功能删除指定对象中的指定成员
b:格式delattr(对象空间,变量名)