天天看点

Python--详细讲解反射has|get|set|delattr

1.反射(内置函数hasattr,getattr,setattr,delattr)

 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(指定对象空间,变量名)

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(对象空间,变量名)