Python中的魔術(shù)方法__call__和__getattr__方法是用于實(shí)現(xiàn)對(duì)象可調(diào)用和屬性訪問的重要方法。
__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)用行為。
(相關(guān)資料圖)
下面是一個(gè)簡單的例子,展示了如何定義一個(gè)可調(diào)用的對(duì)象:
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類,其中__init__方法用于初始化對(duì)象屬性n,call__方法用于實(shí)現(xiàn)對(duì)象的可調(diào)用行為。在Adder類的實(shí)例化過程中,我們將數(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__方法是用于實(shí)現(xiàn)對(duì)象屬性訪問的魔術(shù)方法。當(dāng)我們使用點(diǎn)運(yùn)算符訪問一個(gè)對(duì)象的屬性時(shí),如果該屬性不存在,Python會(huì)自動(dòng)調(diào)用該對(duì)象的__getattr__方法,并將屬性名稱作為參數(shù)傳遞給__getattr__方法。因此,我們可以在__getattr__方法中實(shí)現(xiàn)自定義的屬性訪問行為。
下面是一個(gè)簡單的例子,展示了如何定義一個(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類,其中__getattr__方法用于實(shí)現(xiàn)動(dòng)態(tài)屬性訪問。當(dāng)我們使用點(diǎn)運(yùn)算符訪問DynamicAttr對(duì)象的屬性時(shí),如果屬性名稱為"x"或者"y",__getattr__方法會(huì)返回對(duì)應(yīng)的屬性值。如果屬性名稱不為"x"或者"y",則會(huì)拋出AttributeError異常。因此,我們可以使用__getattr__方法為對(duì)象動(dòng)態(tài)添加屬性,從而實(shí)現(xiàn)靈活的對(duì)象屬性訪問行為。
需要注意的是,__getattr__方法只有在對(duì)象的屬性不存在時(shí)才會(huì)被觸發(fā),因此我們可以在__getattr__方法中實(shí)現(xiàn)對(duì)特定屬性的自定義處理邏輯。同時(shí),getattr__方法也可以與其他屬性訪問方法(如__getattribute__和__setattr)結(jié)合使用,從而實(shí)現(xiàn)更加靈活的對(duì)象屬性訪問和修改行為。
綜上所述,__call__和__getattr__方法是Python中重要的魔術(shù)方法,用于實(shí)現(xiàn)對(duì)象的可調(diào)用行為和屬性訪問行為。在使用這兩個(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類,其中__call__方法用于為對(duì)象動(dòng)態(tài)添加屬性,__getattr__方法用于實(shí)現(xiàn)對(duì)象的動(dòng)態(tài)屬性訪問。在DynamicObject類的實(shí)例化過程中,我們創(chuàng)建了一個(gè)名為_attrs的字典,用于存儲(chǔ)對(duì)象的屬性。然后,我們使用()運(yùn)算符調(diào)用DynamicObject對(duì)象,傳遞屬性名稱和屬性值作為參數(shù),從而動(dòng)態(tài)添加屬性。最后,我們使用點(diǎn)運(yùn)算符訪問DynamicObject對(duì)象的屬性,并使用__getattr__方法實(shí)現(xiàn)屬性訪問行為。
需要注意的是,在這個(gè)例子中,我們使用了下劃線開頭的屬性名稱,以表示這些屬性是私有的。這是因?yàn)樵赑ython中,如果屬性名稱以一個(gè)或多個(gè)下劃線開頭,則表示該屬性是私有的,應(yīng)該避免直接訪問該屬性。如果需要訪問私有屬性,可以使用訪問器方法(如getter和setter方法)來實(shí)現(xiàn)。
關(guān)鍵詞:
Python面向?qū)ο缶幊?魔術(shù)方法-__call__和__getattr__方法 全球快播報(bào) Python中的魔術(shù)方法__call__和__getattr__方法是用于實(shí)現(xiàn)對(duì)象可調(diào)用和屬性訪問的重要方法。
全球微速訊:比《怒嗆人生》更精彩的,是黃阿麗的爽文人生! 比《怒嗆人生》更精彩的,是黃阿麗的爽文人生!,女人,編劇,黃阿麗,富二代,小說家,怒嗆人生
世界視點(diǎn)!45投27中!泰倫-盧:我認(rèn)為球隊(duì)在下半場投出了60%的命中率 45投27中!泰倫-盧:我認(rèn)為球隊(duì)在下半場投出了60%的命中率,快船隊(duì),泰倫·盧,泰倫-盧,nba季后賽
世界新資訊:曼聯(lián)消失了2年,從最近5年曼聯(lián)的引援,看曼聯(lián)夏窗應(yīng)該補(bǔ)強(qiáng)的位置 本賽季的引援想必是令人滿意的,一如2019年夏窗的引援令人感到滿意,可是曼聯(lián)在2020年夏窗的拉胯讓曼聯(lián)進(jìn)步
瓊州海峽進(jìn)島客貨車輛今起實(shí)行全預(yù)約購票過海 央視新聞援引廣東省交通運(yùn)輸廳消息,為了保障海峽通道安全暢通,引導(dǎo)車輛旅客有序出行,自4月22日8時(shí)起,所
暖新聞 走心評(píng) | 6歲女孩為聾啞父親當(dāng)翻譯火遍全網(wǎng),這是一場愛的雙向奔赴_全球新動(dòng)態(tài) 近日,四川成都,一家修腳店在社交網(wǎng)絡(luò)平臺(tái)上火了。一則顧客無意間拍攝的視頻中,店里的小女孩嫻熟地充當(dāng)起
大爆發(fā)!“五一”中長途游量價(jià)齊升 多平臺(tái)預(yù)訂量猛增 【大爆發(fā)!“五一”中長途游量價(jià)齊升多平臺(tái)預(yù)訂量猛增】從客單價(jià)看,“玩得酷”成為旅游消費(fèi)的主流需求,高
外賣騎手的權(quán)益保障,杭州有“法”了!|當(dāng)前熱議 近日,杭州市出臺(tái)《杭州市網(wǎng)絡(luò)餐飲外賣配送監(jiān)督管理辦法》,以三分之一的篇幅規(guī)定了外賣配送員在簽約、培訓(xùn)
要銷量不要利潤?12GB+512GB+1.6億像素,頂配版旗艦手機(jī)價(jià)格暴跌 榮耀手機(jī)的產(chǎn)品系列搭配其實(shí)很怪。其他的手機(jī)廠商都是將數(shù)字系列作為旗艦,而榮耀則是將將magic系列作為高
大白菜u盤啟動(dòng)盤w7-(大白菜u盤啟動(dòng)盤w7怎么用) 大白菜u盤啟動(dòng)盤w7(大白菜u盤啟動(dòng)盤w7怎么用)第一步下載并且安裝好大白菜裝機(jī)版,打開安裝好的大白菜裝機(jī)版
人民財(cái)評(píng):燃旺人間“煙火氣”|環(huán)球快訊 國家統(tǒng)計(jì)局近日公布了今年一季度經(jīng)...
環(huán)球觀焦點(diǎn):讓運(yùn)動(dòng)氛圍更濃 作者:劉天星(北京體育大學(xué)體育融...
金觀平:中國經(jīng)濟(jì)不存在通縮基礎(chǔ) 即時(shí)看 3月份,全國居民消費(fèi)價(jià)格指數(shù)(CPI...
這個(gè)論壇,重點(diǎn)關(guān)注“Z世代” 新消息 作為伴隨互聯(lián)網(wǎng)發(fā)展而長大的一代,...
Python面向?qū)ο缶幊?魔術(shù)方法-__call__和__getattr__方法 全球快播報(bào) Python中的魔術(shù)方法__call__和__ge...
全球微速訊:比《怒嗆人生》更精彩的,是黃阿麗的爽文人生! 比《怒嗆人生》更精彩的,是黃阿麗...
世界視點(diǎn)!45投27中!泰倫-盧:我認(rèn)為球隊(duì)在下半場投出了60%的命中率 45投27中!泰倫-盧:我認(rèn)為球隊(duì)在...
世界新資訊:曼聯(lián)消失了2年,從最近5年曼聯(lián)的引援,看曼聯(lián)夏窗應(yīng)該補(bǔ)強(qiáng)的位置 本賽季的引援想必是令人滿意的,一...