Python面向?qū)ο笾瓷?自省機(jī)制實(shí)例分析
本文實(shí)例講述了Python面向?qū)ο笾瓷?自省機(jī)制。分享給大家供大家參考,具體如下:
反射:程序可以訪問(wèn),檢測(cè)和修改它本身狀態(tài)或行為的一種能力(自?。?/span>
下面就介紹四種實(shí)現(xiàn)自省的函數(shù),適用于類(lèi)和對(duì)象
1. 判斷object中有沒(méi)有一個(gè)name字符串對(duì)應(yīng)的屬性或者方法
hasattr(object,name)
2. 獲取object中name字符串對(duì)應(yīng)的屬性值或者方法地址,其中default參數(shù)的作用是,在找不到屬性的時(shí)候,給予調(diào)用者的提示信息。
getattr(object,name,default= None)
3. 將object中name字符串對(duì)應(yīng)的屬性值設(shè)置為value,這個(gè)屬性可以是新增的屬性。
setattr(object,name,value)
4. 刪除object中name字符串對(duì)應(yīng)的屬性。
delattr(object,name)
四個(gè)方法的演示
class BlackMedium: feture = 'Ugly' def __init__(self,name,addr): self.name = name self.addr = addr def sell_house(self): print('%s賣(mài)房子'%(self.name)) def rent_house(self): print('%s租房子'%(self.name)) b1 = BlackMedium('萬(wàn)成置地','天露園') #檢測(cè)是否含有某個(gè)屬性 print(hasattr(b1,'name')) print(hasattr(b1,'sell_house')) #獲取屬性 temp = getattr(b1,'name') print(temp) func = getattr(b1,'rent_house') func() #getattr(b1,'aaaaaa') 獲取不存在的屬性,就會(huì)報(bào)錯(cuò)。 print(getattr(b1,'aaaaa','該屬性不存在')) #設(shè)置數(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') #刪除不存在的屬性,報(bào)錯(cuò) delattr(b1,'show_name123') print(b1.__dict__)
運(yùn)行結(jié)果:
True
True
萬(wàn)成置地
萬(wàn)成置地租房子
該屬性不存在
{'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'}
萬(wàn)成置地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'
為什么用反射呢?
舉例:兩個(gè)程序員A,B,A在寫(xiě)程序用到B寫(xiě)的類(lèi),但是B還沒(méi)有完成這個(gè)類(lèi)的編寫(xiě)。此時(shí)就可以用到反射,完成A自己想要編寫(xiě)的代碼。并且不影響B(tài)的后期編碼。
好處:可以事先定義好接口,接口只有在被完成時(shí),才會(huì)真正執(zhí)行,實(shí)現(xiàn)了即插即用,也就是一種后期綁定,即先定義接口,后期在實(shí)現(xiàn)接口的功能。
B還沒(méi)有實(shí)現(xiàn)的全部功能
class FtpClient: #ftp客戶(hù)端,但是還沒(méi)有實(shí)現(xiàn)功能 def __init__(self,addr): print('正在連接服務(wù)器[%s]'%(self.addr)) self.addr = addr
A后期的代碼編寫(xiě)
from module import FtpClient f1 = FtpClient('198.1.1.1') #在編寫(xiě)某個(gè)方法前,先判斷該方法是否存在,存在就可以直接調(diào)用,不存在就要編寫(xiě)。 if hasattr(f1,'get'): func_get = getattr(f1,'get') func_get() else print('-----》不存在這個(gè)方法') print('處理其他的邏輯')
更多關(guān)于Python相關(guān)內(nèi)容感興趣的讀者可查看本站專(zhuān)題:《Python面向?qū)ο蟪绦蛟O(shè)計(jì)入門(mén)與進(jìn)階教程》、《Python數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Python函數(shù)使用技巧總結(jié)》、《Python字符串操作技巧匯總》、《Python編碼操作技巧總結(jié)》及《Python入門(mén)與進(jìn)階經(jīng)典教程》
希望本文所述對(duì)大家Python程序設(shè)計(jì)有所幫助。
相關(guān)文章
Flask框架中密碼的加鹽哈希加密和驗(yàn)證功能的用法詳解
加鹽加密就是在加密時(shí)混入一段隨機(jī)字符串,這段字符串便被稱(chēng)為"鹽值",這里我們來(lái)看一下Python的Flask框架中密碼的加鹽哈希加密和驗(yàn)證功能的用法詳解:2016-06-06python?spotlight庫(kù)簡(jiǎn)化交互式方法探索數(shù)據(jù)分析
這篇文章主要為大家介紹了python?spotlight庫(kù)簡(jiǎn)化的交互式方法探索數(shù)據(jù),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2024-01-01Python調(diào)用API接口實(shí)現(xiàn)人臉識(shí)別
本文主要介紹了Python調(diào)用API接口實(shí)現(xiàn)人臉識(shí)別,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-02-02Python字典dict常用方法函數(shù)實(shí)例
這篇文章主要介紹了Python字典dict常用方法函數(shù)實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-11-11python打包exe開(kāi)機(jī)自動(dòng)啟動(dòng)的實(shí)例(windows)
今天小編就為大家分享一篇python打包exe開(kāi)機(jī)自動(dòng)啟動(dòng)的實(shí)例(windows),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-06-06python 編碼中為什么要寫(xiě)類(lèi)型注解?
這篇文章主要介紹了python 編碼中為什么要寫(xiě)類(lèi)型注解,幫助大家更好的理解和學(xué)習(xí)使用python,感興趣的朋友可以了解下2021-03-03Python實(shí)現(xiàn)字典的遍歷與排序功能示例
這篇文章主要介紹了Python實(shí)現(xiàn)字典的遍歷與排序功能,結(jié)合實(shí)例形式分析了Python字典的遍歷與排序相關(guān)函數(shù)與使用技巧,需要的朋友可以參考下2017-12-12