Python面向對象之反射/自省機制實例分析
本文實例講述了Python面向對象之反射/自省機制。分享給大家供大家參考,具體如下:
反射:程序可以訪問,檢測和修改它本身狀態(tài)或行為的一種能力(自?。?/span>
下面就介紹四種實現(xiàn)自省的函數(shù),適用于類和對象
1. 判斷object中有沒有一個name字符串對應的屬性或者方法
hasattr(object,name)
2. 獲取object中name字符串對應的屬性值或者方法地址,其中default參數(shù)的作用是,在找不到屬性的時候,給予調用者的提示信息。
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','該屬性不存在'))
#設置數(shù)據(jù)屬性和方法屬性
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(tài)的后期編碼。
好處:可以事先定義好接口,接口只有在被完成時,才會真正執(zhí)行,實現(xiàn)了即插即用,也就是一種后期綁定,即先定義接口,后期在實現(xiàn)接口的功能。
B還沒有實現(xiàn)的全部功能
class FtpClient:
#ftp客戶端,但是還沒有實現(xiàn)功能
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相關內容感興趣的讀者可查看本站專題:《Python面向對象程序設計入門與進階教程》、《Python數(shù)據(jù)結構與算法教程》、《Python函數(shù)使用技巧總結》、《Python字符串操作技巧匯總》、《Python編碼操作技巧總結》及《Python入門與進階經(jīng)典教程》
希望本文所述對大家Python程序設計有所幫助。
相關文章
Python使用Selenium獲取Web頁面信息的流程步驟
在 Web 自動化測試和數(shù)據(jù)抓取中,獲取頁面信息是一個基本且重要的操作,通過 Selenium,您可以輕松地獲取頁面的各種信息,這些信息不僅可以用于驗證測試結果,還可以用于數(shù)據(jù)分析和處理,所以本文給大家介紹了Python使用Selenium獲取Web頁面信息的流程步驟2025-03-03
Python Flask框架開發(fā)之運用SocketIO實現(xiàn)WebSSH方法詳解
Socket.IO本是一個面向實時web應用的JavaScript庫,現(xiàn)在已成為擁有眾多語言支持的Web即時通訊應用的框架。這篇文章主要介紹了Python 運用SocketIO實現(xiàn)WebSSH方法2022-10-10
Python使用monkey.patch_all()解決協(xié)程阻塞問題
這篇文章主要介紹了Python使用monkey.patch_all()解決協(xié)程阻塞問題,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-04-04
Pytorch中的數(shù)據(jù)轉換Transforms與DataLoader方式
這篇文章主要介紹了Pytorch中的數(shù)據(jù)轉換Transforms與DataLoader方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-02-02
一次性徹底講透Python中pd.concat與pd.merge
本文主要介紹了一次性徹底講透Python中pd.concat與pd.merge,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2022-06-06

