您好,登錄后才能下訂單哦!
小編給大家分享一下Python面向對象之反射機制怎么使用,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!
反射:程序可以訪問,檢測和修改它本身狀態或行為的一種能力(自省)
下面就介紹四種實現自省的函數,適用于類和對象
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
A后期的代碼編寫
from module import FtpClient f1 = FtpClient('198.1.1.1') #在編寫某個方法前,先判斷該方法是否存在,存在就可以直接調用,不存在就要編寫。 if hasattr(f1,'get'): func_get = getattr(f1,'get') func_get() else print('-----》不存在這個方法') print('處理其他的邏輯')
以上是“Python面向對象之反射機制怎么使用”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。