本文實例講述了Python面向對象之反射/自省機制。分享給大家供大家參考,具體如下:
反射:程序可以訪問,檢測和修改它本身狀態或行為的一種能力(自?。?/p>
下面就介紹四種實現自省的函數,適用于類和對象
1. 判斷object中有沒有一個name字符串對應的屬性或者方法
hasattr(object,name)
2. 獲取object中name字符串對應的屬性值或者方法地址,其中default參數的作用是,在找不到屬性的時候,給予調用者的提示信息。
getattr(object,name,default= None)
3. 將object中name字符串對應的屬性值設置為value,這個屬性可以是新增的屬性。
setattr(object,name,value)
4. 刪除object中name字符串對應的屬性。
delattr(object,name)
四個方法的演示
class BlackMedium: feture = 'Ugly' def __init__(self,name,addr): self.name = name self.addr = addr def sell_house(self): print('%s賣房子'%(self.name)) def rent_house(self): print('%s租房子'%(self.name))b1 = BlackMedium('萬成置地','天露園')#檢測是否含有某個屬性print(hasattr(b1,'name'))print(hasattr(b1,'sell_house'))#獲取屬性temp = getattr(b1,'name')print(temp)func = getattr(b1,'rent_house')func()#getattr(b1,'aaaaaa') 獲取不存在的屬性,就會報錯。print(getattr(b1,'aaaaa','該屬性不存在'))#設置數據屬性和方法屬性setattr(b1,'sb',True)setattr(b1,'show_name',lambda self:self.name + 'sb')print(b1.__dict__)print(b1.show_name(b1))#刪除屬性delattr(b1,'addr')delattr(b1,'show_name')#刪除不存在的屬性,報錯delattr(b1,'show_name123')print(b1.__dict__)
運行結果:
True
True
萬成置地
萬成置地租房子
該屬性不存在
{'sb': True, 'show_name': <function <lambda> at 0x01BCA7F0>, 'name': '/xe4/xb8/x87/xe6/x88/x90/xe7/xbd/xae/xe5/x9c/xb0', 'addr': '/xe5/xa4/xa9/xe9/x9c/xb2/xe5/x9b/xad'}
萬成置地sb
Traceback (most recent call last):
File "C:/py/jb51PyDemo/src/Demo/test.py", line 37, in <module>
delattr(b1,'show_name123')
AttributeError: BlackMedium instance has no attribute 'show_name123'
為什么用反射呢?
舉例:兩個程序員A,B,A在寫程序用到B寫的類,但是B還沒有完成這個類的編寫。此時就可以用到反射,完成A自己想要編寫的代碼。并且不影響B的后期編碼。
好處:可以事先定義好接口,接口只有在被完成時,才會真正執行,實現了即插即用,也就是一種后期綁定,即先定義接口,后期在實現接口的功能。
B還沒有實現的全部功能
class FtpClient: #ftp客戶端,但是還沒有實現功能 def __init__(self,addr): print('正在連接服務器[%s]'%(self.addr)) self.addr = addr
新聞熱點
疑難解答