Python面向?qū)ο缶幊?魔術(shù)方法-__call__和__getattr__方法
Python中的魔術(shù)方法__call__和__getattr__方法是用于實(shí)現(xiàn)對(duì)象可調(diào)用和屬性訪(fǎng)問(wèn)的重要方法。
__call__方法
__call__方法是用于定義對(duì)象可調(diào)用行為的魔術(shù)方法。當(dāng)我們使用()運(yùn)算符調(diào)用一個(gè)對(duì)象時(shí),Python會(huì)自動(dòng)調(diào)用該對(duì)象的__call__方法,并將()中的參數(shù)傳遞給__call__方法。因此,我們可以在__call__方法中實(shí)現(xiàn)自定義的對(duì)象調(diào)用行為。
下面是一個(gè)簡(jiǎn)單的例子,展示了如何定義一個(gè)可調(diào)用的對(duì)象:
(相關(guān)資料圖)
class Adder: def __init__(self, n): self.n = n def __call__(self, x): return self.n + xadd5 = Adder(5)print(add5(3)) # 輸出: 8
在上面的例子中,我們定義了一個(gè)Adder類(lèi),其中__init__方法用于初始化對(duì)象屬性n,call__方法用于實(shí)現(xiàn)對(duì)象的可調(diào)用行為。在Adder類(lèi)的實(shí)例化過(guò)程中,我們將數(shù)字5傳遞給了構(gòu)造方法__init,從而初始化了Adder對(duì)象的屬性n。然后,我們創(chuàng)建了一個(gè)名為add5的Adder對(duì)象,并使用()運(yùn)算符將數(shù)字3傳遞給了add5對(duì)象。這時(shí),Python會(huì)自動(dòng)調(diào)用add5對(duì)象的__call__方法,將數(shù)字3作為參數(shù)傳遞給__call__方法,并返回n + x的結(jié)果,即8。
需要注意的是,__call__方法只有在對(duì)象被調(diào)用時(shí)才會(huì)被觸發(fā),因此我們可以在__call__方法中實(shí)現(xiàn)復(fù)雜的計(jì)算邏輯或者狀態(tài)更新操作。同時(shí),__call__方法也可以帶有參數(shù),從而支持多種不同的調(diào)用方式。
__getattr__方法
__getattr__方法是用于實(shí)現(xiàn)對(duì)象屬性訪(fǎng)問(wèn)的魔術(shù)方法。當(dāng)我們使用點(diǎn)運(yùn)算符訪(fǎng)問(wèn)一個(gè)對(duì)象的屬性時(shí),如果該屬性不存在,Python會(huì)自動(dòng)調(diào)用該對(duì)象的__getattr__方法,并將屬性名稱(chēng)作為參數(shù)傳遞給__getattr__方法。因此,我們可以在__getattr__方法中實(shí)現(xiàn)自定義的屬性訪(fǎng)問(wèn)行為。
下面是一個(gè)簡(jiǎn)單的例子,展示了如何定義一個(gè)具有動(dòng)態(tài)屬性的對(duì)象:
class DynamicAttr: def __getattr__(self, name): if name == "x": return 1 elif name == "y": return 2 else: raise AttributeError(f""DynamicAttr" object has no attribute "{name}"")obj = DynamicAttr()print(obj.x) # 輸出: 1print(obj.y) # 輸出: 2print(obj.z) # 輸出: AttributeError: "DynamicAttr" object has no attribute "z"
在上面的例子中,我們定義了一個(gè)DynamicAttr類(lèi),其中__getattr__方法用于實(shí)現(xiàn)動(dòng)態(tài)屬性訪(fǎng)問(wèn)。當(dāng)我們使用點(diǎn)運(yùn)算符訪(fǎng)問(wèn)DynamicAttr對(duì)象的屬性時(shí),如果屬性名稱(chēng)為"x"或者"y",__getattr__方法會(huì)返回對(duì)應(yīng)的屬性值。如果屬性名稱(chēng)不為"x"或者"y",則會(huì)拋出AttributeError異常。因此,我們可以使用__getattr__方法為對(duì)象動(dòng)態(tài)添加屬性,從而實(shí)現(xiàn)靈活的對(duì)象屬性訪(fǎng)問(wèn)行為。
需要注意的是,__getattr__方法只有在對(duì)象的屬性不存在時(shí)才會(huì)被觸發(fā),因此我們可以在__getattr__方法中實(shí)現(xiàn)對(duì)特定屬性的自定義處理邏輯。同時(shí),getattr__方法也可以與其他屬性訪(fǎng)問(wèn)方法(如__getattribute__和__setattr)結(jié)合使用,從而實(shí)現(xiàn)更加靈活的對(duì)象屬性訪(fǎng)問(wèn)和修改行為。
綜上所述,__call__和__getattr__方法是Python中重要的魔術(shù)方法,用于實(shí)現(xiàn)對(duì)象的可調(diào)用行為和屬性訪(fǎng)問(wèn)行為。在使用這兩個(gè)方法時(shí),我們應(yīng)該注意方法的作用和使用方式,并根據(jù)需要實(shí)現(xiàn)自定義的行為。下面是一個(gè)綜合示例,展示了如何使用__call__和__getattr__方法實(shí)現(xiàn)一個(gè)具有動(dòng)態(tài)屬性和可調(diào)用行為的對(duì)象:
class DynamicObject: def __init__(self): self._attrs = {} def __call__(self, name, value): self._attrs[name] = value def __getattr__(self, name): if name in self._attrs: return self._attrs[name] else: raise AttributeError(f""DynamicObject" object has no attribute "{name}"")obj = DynamicObject()obj("x", 1)obj("y", 2)print(obj.x) # 輸出: 1print(obj.y) # 輸出: 2print(obj.z) # 輸出: AttributeError: "DynamicObject" object has no attribute "z"
在上面的例子中,我們定義了一個(gè)DynamicObject類(lèi),其中__call__方法用于為對(duì)象動(dòng)態(tài)添加屬性,__getattr__方法用于實(shí)現(xiàn)對(duì)象的動(dòng)態(tài)屬性訪(fǎng)問(wèn)。在DynamicObject類(lèi)的實(shí)例化過(guò)程中,我們創(chuàng)建了一個(gè)名為_(kāi)attrs的字典,用于存儲(chǔ)對(duì)象的屬性。然后,我們使用()運(yùn)算符調(diào)用DynamicObject對(duì)象,傳遞屬性名稱(chēng)和屬性值作為參數(shù),從而動(dòng)態(tài)添加屬性。最后,我們使用點(diǎn)運(yùn)算符訪(fǎng)問(wèn)DynamicObject對(duì)象的屬性,并使用__getattr__方法實(shí)現(xiàn)屬性訪(fǎng)問(wèn)行為。
需要注意的是,在這個(gè)例子中,我們使用了下劃線(xiàn)開(kāi)頭的屬性名稱(chēng),以表示這些屬性是私有的。這是因?yàn)樵赑ython中,如果屬性名稱(chēng)以一個(gè)或多個(gè)下劃線(xiàn)開(kāi)頭,則表示該屬性是私有的,應(yīng)該避免直接訪(fǎng)問(wèn)該屬性。如果需要訪(fǎng)問(wèn)私有屬性,可以使用訪(fǎng)問(wèn)器方法(如getter和setter方法)來(lái)實(shí)現(xiàn)。
關(guān)鍵詞:
精心推薦
- Python面向?qū)ο缶幊?魔術(shù)方法-__call__和__getattr__方法
- 昌圖縣氣象局發(fā)布大風(fēng)藍(lán)色預(yù)警【Ⅳ級(jí)/一般】
- 北京:9條騎行線(xiàn)路串起五大水系 濱水慢行系統(tǒng)將達(dá)千余公里-天天快資訊
- 大摩:維持中國(guó)電信(00728)“增持”評(píng)級(jí) 目標(biāo)價(jià)5港元 精彩看點(diǎn)
- 環(huán)球熱訊:大風(fēng)!降雨!成都這些地方注意
- 沈陽(yáng)為本地戶(hù)籍家庭發(fā)放三孩育兒補(bǔ)貼|快看點(diǎn)
- 蘋(píng)果最強(qiáng)對(duì)手來(lái)了!小米13 Ultra首銷(xiāo):5999元買(mǎi)安卓影像之王
- 武當(dāng)山將舉辦系列活動(dòng)隆重紀(jì)念徐霞客登臨400周年|天天速看
- 黃金大劫案!加拿大機(jī)場(chǎng)1.6噸黃金被盜 價(jià)值超億|世界簡(jiǎn)訊
- 廣東北部灣農(nóng)旅產(chǎn)業(yè)園開(kāi)園_環(huán)球即時(shí)
- 世界即時(shí):張愛(ài)玲紅玫瑰與白玫瑰名句_張愛(ài)玲紅玫瑰與白玫瑰語(yǔ)錄
- 你現(xiàn)在能刷手機(jī),全靠他 50 年前的一句話(huà) 環(huán)球熱門(mén)
- 每日視點(diǎn)!斗羅大陸唐三的魂環(huán)分別是什么_斗羅大陸唐三的魂環(huán)
- 焦點(diǎn)快看:人民海軍將在成立紀(jì)念日舉辦系列活動(dòng)
-
在實(shí)驗(yàn)室里工作的侯旭。受訪(fǎng)者供圖核心閱讀廈門(mén)大學(xué)教授侯旭長(zhǎng)期致力于液基材料系統(tǒng)的研究。他聚焦多學(xué)科交叉前沿,在微觀世界打造一個(gè)“液體
-
在狄龍-布魯克斯成為NBA惡名昭彰的球員之前,他差點(diǎn)就被托尼-麥金太爾“毀”了。麥金太爾是加拿大AAU籃球強(qiáng)隊(duì)CIABounce的教練和聯(lián)合創(chuàng)始人,他
-
三星i458是三星新機(jī)曝光的一款以音樂(lè)播放為主要賣(mài)點(diǎn)的手機(jī)。這款手機(jī)采用了雙向滑蓋設(shè)計(jì)。101x52x17 8
-
4月17日,南寧市公安局南湖分局“飛鷹行動(dòng)隊(duì)”在轄區(qū)某小區(qū)內(nèi),抓獲兩名盜竊電動(dòng)自行車(chē)犯罪嫌疑人及一名收購(gòu)被盜電動(dòng)車(chē)的犯罪
-
1、水泥砂漿分五個(gè)強(qiáng)度等級(jí):M5、M7 5、M10、M15、M20其中,M5水泥砂漿強(qiáng)度最低,一般用于砌筑非承重墻、和臨
X 關(guān)閉
資訊
- 2021年國(guó)家開(kāi)發(fā)銀行全年發(fā)放貸款5948億元支持鄉(xiāng)村振興
- 國(guó)家知識(shí)產(chǎn)權(quán)局出臺(tái)推動(dòng)知識(shí)產(chǎn)權(quán)高質(zhì)量發(fā)展年度工作指引(2022)
- 中國(guó)六部門(mén)印發(fā)加強(qiáng)中央財(cái)政銜接推進(jìn)鄉(xiāng)村振興補(bǔ)助資金使用管理的指導(dǎo)意見(jiàn)
- 冷空氣將影響中東部地區(qū) 華北黃淮大氣擴(kuò)散條件較差
- “水下洛神”何灝浩:《洛神水賦》是可以“吹”一輩子的作品
- IT專(zhuān)家成了中藥行家
- 江西省宜春經(jīng)濟(jì)技術(shù)開(kāi)發(fā)區(qū)黨工委原副書(shū)記、管委會(huì)原主任鄧寄鵬嚴(yán)重違紀(jì)違法案剖析
- 單細(xì)胞測(cè)序 揭示家豬胸腰椎發(fā)育相關(guān)機(jī)制
行業(yè)
- 1、清華博士非洲修電站 因?yàn)樗?,“?nèi)卷”成為網(wǎng)絡(luò)熱詞
- 2、內(nèi)蒙古新增本土確診病例3例 均在呼倫貝爾滿(mǎn)洲里市
- 3、31省份新增新冠肺炎確診病例67例 其中本土50例
- 4、浙江新增本土確診病例45例 其中寧波6例、紹興39例
- 5、廣東新增本土確診2例、本土無(wú)癥狀感染者2例
- 6、警惕非法集資的四種新“馬甲”
- 7、北京今天最高氣溫6℃ 新一輪冷空氣攜大風(fēng)降溫將至
- 8、網(wǎng)紅娃娃“戲入人生”別太早
- 9、那年今日 | 歷史上的12月15日發(fā)生過(guò)什么大事?
- 10、南昌市經(jīng)開(kāi)區(qū)醫(yī)療器械公司廠(chǎng)房火災(zāi)已造成5死1傷
X 關(guān)閉
產(chǎn)業(yè)
-
不用跑北京 在家門(mén)口也能掛上頂...
日前,我省首個(gè)神經(jīng)疾病會(huì)診中心——首都醫(yī)科大學(xué)宣武醫(yī)院河北醫(yī)院...
-
“十四五”期間 河北省將優(yōu)化快...
從省郵政管理局獲悉,十四五期間,我省將優(yōu)化快遞空間布局,著力構(gòu)...
-
張家口市宣化區(qū):光伏發(fā)電站賦能...
3月19日拍攝的張家口市宣化區(qū)春光鄉(xiāng)曹莊子村光伏發(fā)電站。張家口市宣...
-
“張同學(xué)”商標(biāo)被多方搶注 涉及...
“張同學(xué)”商標(biāo)被多方搶注,官方曾點(diǎn)名批評(píng)惡意搶注“丁真” ...
-
山東濟(jì)南“防詐奶奶團(tuán)”花式反詐...
中新網(wǎng)濟(jì)南12月15日電 (李明芮)“老有所為 無(wú)私奉獻(xiàn) 志愿服...
-
廣州新增1例境外輸入關(guān)聯(lián)無(wú)癥狀...
廣州衛(wèi)健委今日通報(bào),2021年12月15日,在對(duì)入境轉(zhuǎn)運(yùn)專(zhuān)班工作人...
-
西安報(bào)告初篩陽(yáng)性病例轉(zhuǎn)為確診病例
12月15日10:20,經(jīng)陜西西安市級(jí)專(zhuān)家組會(huì)診,西安市報(bào)告新冠病毒...
-
廣東東莞新增本土確診病例2例 ...
(抗擊新冠肺炎)廣東東莞新增本土確診病例2例 全市全員核酸檢測(cè)...
-
中緬邊境臨滄:民警深夜出擊搗毀...
中新網(wǎng)臨滄12月15日電 (胡波 邱珺琿)記者15日從云南臨滄邊境...
-
“土家鼓王”彭承金:致力傳承土...
中新網(wǎng)恩施12月15日電 題:“土家鼓王”彭承金:致力傳承土家...