Python_反射

一.反射定義
放射是指程序可以訪問。檢測和修改它本身狀態或行爲的一種能力(自省)。
二.四個自省的函數
Python中提供了以下四種自省的函數,使用於類和對象。
1.hasattr函數--用於判斷obj中有沒有name字符串對應的方法或屬性,若有返回Ture,若無則返回False。
格式:hasattr(obj,name)
Python_反射
2.getattr--用於獲取obj中name字符串的地址,若有返回內置地址,若無則報錯。
格式:getattr(obj,name,defaultvalue) --defaultvalue定義若沒有name則返回的默認值。
Python_反射
3.Setattr--用於修改obj中name的值爲value,若開始obj中無name字符串則新增,若有則進行修改。其本質是操作obj.dict屬性字典
格式:getattr(obj,name,value)
Python_反射
4.delattr--用於刪除obj中name的屬性,若有則刪除,若無則報錯
格式:delattr(obj,name)
Python_反射
5.該部分代碼塊爲:

class School():
    price = 12000
    __leadteacher = "劉昌明"   #雙下劃線開頭的數據屬性
    def __init__(self,name,addr,type):
        self.name = name
        self.addr = addr
        self.type = type
    def showinfo(self):
        print("%s位於%s,是一所%s大學,學費是%s"%(self.name,self.addr,self.type,self.price))
    def __activy(self):
        print("學校正在舉辦書法比賽")
    def returninfo(self):           #通過類中的函數來訪問隱藏的屬性,以供外部調用,這纔是真正意義上的封裝
        print("這個學校的現在是%s"%self.__leadteacher)
        self.__activy()

s1 =School("長江大學","湖北省荊州市","國立一本")
"""
#hasattr
print(hasattr(s1,"__leadteacher"))  #私有數據屬性
print(hasattr(s1,"price"))
print(hasattr(s1,"name"))
print(hasattr(s1,"showinfo"))
print(hasattr(s1,"__activy"))       #私有函數屬性
"""
"""
#getattr
print(getattr(s1,"__leadteacher","沒有這個屬性"))
print(getattr(s1,"price","沒有這個屬性"))
print(getattr(s1,"name","沒有這個屬性"))
print(getattr(s1,"showinfo","沒有這個屬性"))
print(getattr(s1,"__activy","沒有這個屬性"))
#通過getattr運行對應的函數
getattr(s1,"showinfo","沒有這個屬性")()
"""

"""
#setattr函數
print(s1.price)
#更改類的數據屬性,有則修改,沒有則新增---->其本質就是操作類的屬性字典
setattr(s1,'price',23000)
print(s1.price)
setattr(s1,'number',34000)
print(s1.number)
#更改類的函數屬性
def test():
    print("這是一個測試函數")
s1.showinfo()
#若有則更改
setattr(s1,'showinfo',test)
s1.showinfo()
#若無則新增
setattr(s1,'add',test)
s1.add()
"""

"""
#通過delattr來刪除屬性
setattr(s1,'number',34000)
def test():
    print("這是一個測試函數")
setattr(s1,'add',test)
print(getattr(s1,'number',"沒有這個屬性"))
delattr(s1,'number')
print(getattr(s1,'number',"沒有這個屬性"))
s1.add()
delattr(s1,'add')
s1.add()
"""

三.爲什麼要用反射?
從上面我們可以知道,通過反射的四個函數可以操作類中的數據屬性和函數屬性,這樣,類的外部可以查看、調用類的屬性,當有需要的時候,我們可以在在不影響原類的基礎上快速完成自己想要的工作。例如:程序員A本來是負責編寫了類Teacher的,但是當時可能有事耽擱了,但是程序員B要調用類Teacher,這樣是不是很尷尬?又不能讓B因爲A的原因導致了工作不進行。此時,我們就可以使使用反射函數來處理該部分代碼,如下圖所示:
Python_反射

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章