天天看點

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(對象空間,變量名)