11.反射(內置函數的一種)

反射

反射的概念是由Smith在1982年首次提出的,主要是指程序可以訪問、檢測和修改它本身狀態或行爲的一種能力(自省)。這一概念的提出很快引發了計算機科學領域關於應用反射性的研究。它首先被程序語言的設計領域所採用,並在Lisp和麪向對象方面取得了成績。
python面向對象中的反射:通過字符串的形式操作對象相關的屬性。python中的一切事物都是對象(都可以使用反射)
四個可以實現自省的函數 下列方法適用於類和對象(一切皆對象,類本身也是一個對象)

1.hasattr(object,key)

判斷object中有沒有一個name字符串對應的方法或屬性,即判斷object.key存不存在

2.getattr(object, key, default=None)

得到object中name屬性對應的值,相當於執行object.dict[‘key’],得到該字典關鍵字對應的值,若值不存在返回default後面的默認值。

3.setattr(object, key, value)

將類object中的關鍵字key對應的值改成value,或者增加關鍵字以及對應的的值,(增加object的數據屬性)

4.delattr(object, key)

刪除類object字典中key對應的關鍵字以及對應的值,相當於執行 del object.key

四個函數代碼如下:

class People:
    def __init__(self,name,age):
        self.name=name
        self.age=age

    def tell_info(self):
        print('name :%s /n age:%s' %(self.name,self.age))

stu=People('sunwukong',188)

print(hasattr(stu,'name'))                   #True

print(getattr(stu,'name',None))              #sunwukong
print(getattr(stu,'sex','不存在該關鍵字'))     #不存在該關鍵字

setattr(stu,'name','tangsanzang')
print(stu.name)                                #tangsanzang
setattr(stu,'sex','male')
print(stu.sex)                                 #male

delattr(stu,'sex')
print(stu.sex )            #程序會報錯:AttributeError: sex

反射的應用


class Service:
    def run(self):
        while True:
            inp=input('--->').strip()
            cmds=inp.split()
            if hasattr(self,cmds[0]):
                func=getattr(self,cmds[0])
                func(cmds)

    def get(self,cmds):
        print('執行get \n輸出:',cmds[1])

    def put(self,cmds):
        print('執行put \n輸出:',cmds[1])


serv=Service()
serv.run()

#運行結果如下:
# --->get qq:1332606303
# 執行get 
# 輸出: qq:1332606303
# --->put qq
# 執行put 
# 輸出: qq
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章