Python面向?qū)ο缶幊?魔術(shù)方法-__call__和__getattr__方法
Python中的魔術(shù)方法__call__和__getattr__方法是用于實現(xiàn)對象可調(diào)用和屬性訪問的重要方法。
(資料圖片僅供參考)
__call__方法
__call__方法是用于定義對象可調(diào)用行為的魔術(shù)方法。當我們使用()運算符調(diào)用一個對象時,Python會自動調(diào)用該對象的__call__方法,并將()中的參數(shù)傳遞給__call__方法。因此,我們可以在__call__方法中實現(xiàn)自定義的對象調(diào)用行為。
下面是一個簡單的例子,展示了如何定義一個可調(diào)用的對象:
class Adder: def __init__(self, n): self.n = n def __call__(self, x): return self.n + xadd5 = Adder(5)print(add5(3)) # 輸出: 8
在上面的例子中,我們定義了一個Adder類,其中__init__方法用于初始化對象屬性n,call__方法用于實現(xiàn)對象的可調(diào)用行為。在Adder類的實例化過程中,我們將數(shù)字5傳遞給了構(gòu)造方法__init,從而初始化了Adder對象的屬性n。然后,我們創(chuàng)建了一個名為add5的Adder對象,并使用()運算符將數(shù)字3傳遞給了add5對象。這時,Python會自動調(diào)用add5對象的__call__方法,將數(shù)字3作為參數(shù)傳遞給__call__方法,并返回n + x的結(jié)果,即8。
需要注意的是,__call__方法只有在對象被調(diào)用時才會被觸發(fā),因此我們可以在__call__方法中實現(xiàn)復(fù)雜的計算邏輯或者狀態(tài)更新操作。同時,__call__方法也可以帶有參數(shù),從而支持多種不同的調(diào)用方式。
__getattr__方法
__getattr__方法是用于實現(xiàn)對象屬性訪問的魔術(shù)方法。當我們使用點運算符訪問一個對象的屬性時,如果該屬性不存在,Python會自動調(diào)用該對象的__getattr__方法,并將屬性名稱作為參數(shù)傳遞給__getattr__方法。因此,我們可以在__getattr__方法中實現(xiàn)自定義的屬性訪問行為。
下面是一個簡單的例子,展示了如何定義一個具有動態(tài)屬性的對象:
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"
在上面的例子中,我們定義了一個DynamicAttr類,其中__getattr__方法用于實現(xiàn)動態(tài)屬性訪問。當我們使用點運算符訪問DynamicAttr對象的屬性時,如果屬性名稱為"x"或者"y",__getattr__方法會返回對應(yīng)的屬性值。如果屬性名稱不為"x"或者"y",則會拋出AttributeError異常。因此,我們可以使用__getattr__方法為對象動態(tài)添加屬性,從而實現(xiàn)靈活的對象屬性訪問行為。
需要注意的是,__getattr__方法只有在對象的屬性不存在時才會被觸發(fā),因此我們可以在__getattr__方法中實現(xiàn)對特定屬性的自定義處理邏輯。同時,getattr__方法也可以與其他屬性訪問方法(如__getattribute__和__setattr)結(jié)合使用,從而實現(xiàn)更加靈活的對象屬性訪問和修改行為。
綜上所述,__call__和__getattr__方法是Python中重要的魔術(shù)方法,用于實現(xiàn)對象的可調(diào)用行為和屬性訪問行為。在使用這兩個方法時,我們應(yīng)該注意方法的作用和使用方式,并根據(jù)需要實現(xiàn)自定義的行為。下面是一個綜合示例,展示了如何使用__call__和__getattr__方法實現(xiàn)一個具有動態(tài)屬性和可調(diào)用行為的對象:
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"
在上面的例子中,我們定義了一個DynamicObject類,其中__call__方法用于為對象動態(tài)添加屬性,__getattr__方法用于實現(xiàn)對象的動態(tài)屬性訪問。在DynamicObject類的實例化過程中,我們創(chuàng)建了一個名為_attrs的字典,用于存儲對象的屬性。然后,我們使用()運算符調(diào)用DynamicObject對象,傳遞屬性名稱和屬性值作為參數(shù),從而動態(tài)添加屬性。最后,我們使用點運算符訪問DynamicObject對象的屬性,并使用__getattr__方法實現(xiàn)屬性訪問行為。
需要注意的是,在這個例子中,我們使用了下劃線開頭的屬性名稱,以表示這些屬性是私有的。這是因為在Python中,如果屬性名稱以一個或多個下劃線開頭,則表示該屬性是私有的,應(yīng)該避免直接訪問該屬性。如果需要訪問私有屬性,可以使用訪問器方法(如getter和setter方法)來實現(xiàn)。
關(guān)鍵詞:
下一篇:最后一頁
- 個人護理小家電市場結(jié)構(gòu)迎變局 新興渠道規(guī)模不容小覷
- 廣州科技活動周進入預(yù)熱 明日正式啟動300多場主題活動接踵而來
- 深化重點領(lǐng)域信用建設(shè) 廣州正式出臺新型監(jiān)管機制實施方案
- 女童不慎掉入20米深井 18歲小姨三次下井成功營救
- 西安3個區(qū)域12月28日起每日開展全員核酸 官方提倡民眾居家健身
- 浙江樂清一核酸檢測結(jié)果異常人員 復(fù)采復(fù)檢為陰性
- 浙江本輪疫情報告確診病例490例 提倡“雙節(jié)”非必要不出省
- 西安警方通報6起涉疫違法案件
- 西安新一輪核酸篩查日檢測能力達160萬管
- 西安市累計報告本土確診病例811例
-
金陵藥業(yè):分公司收復(fù)方磺胺甲噁唑注射液一致性評價受理通知書 天天播資訊
金陵藥業(yè):分公司收復(fù)方磺胺甲噁唑注射液一致性評價受理通知書
-
山西煤炭運銷集團臨汾霍州有限公司
1、山西煤炭運銷集團臨汾霍州有限公司于2009年07月30日成立。2、法定代表人霍俊杰,公司經(jīng)營范圍包括:煤炭
-
梅西·保利失點球+世界波破門,南京城市隊2:0黑龍江拿下中甲開門紅! 世界快消息
第22分鐘,南京城市隊從中場開始被斷球,隨后后防線又出現(xiàn)失誤,幸好黃子豪及時出擊將球阻攔,沒讓黑龍江冰
-
當前要聞:聯(lián)想 ThinkPad 五月發(fā)布新品,包括全新 T14p 型號
IT之家4月22日消息,聯(lián)想透露,ThinkPad將在5月舉行一場發(fā)布會,預(yù)計將推出多款新品。官方表示,ThinkPad將
-
塔防成長記什么時候出 公測上線時間預(yù)告 環(huán)球訊息
導(dǎo)讀:最近很多玩家都在關(guān)注塔防成長記這款手游,想知道具體的公測時間,塔防成長記會經(jīng)過封測、刪檔內(nèi)測、
-
深圳哪個山最高
1、深圳最高的山是梧桐山。2、位于深圳特區(qū)的東部。3、主峰海拔943 7米。本文到此分享完畢,希望對大家有所
-
當前熱議!蔣讀音_漿讀音
1、一、漿是一個多音字,拼音是jiāng和jiàng。2、二、漿字的基本釋義:[jiāng]較濃的液體:豆?jié){。3、泥
-
RMC:無論有沒有歐冠,齊達內(nèi)都將尤文視作為其首要任務(wù)-每日短訊
RMC體育消息稱,齊達內(nèi)準備尋找一個長期、可進步的足球項目,即便意味著尤文可能會暫時無緣歐冠,而尤文圖
-
今日精選:滕哈赫一年前的今天上任曼聯(lián)帥位,至今率隊52戰(zhàn)取勝36場
一年前的4月21日,曼聯(lián)正式任命滕哈赫為球隊新帥,曼聯(lián)官方發(fā)文紀念滕哈赫上任一周年。滕哈赫去年4月21日被
-
最貴比亞迪!預(yù)售109.8萬元,普通人真買不起!_環(huán)球即時看
最貴比亞迪!預(yù)售109 8萬元,普通人真買不起!
X 關(guān)閉
未婚先孕?被哄騙生孩子? 全球熱點評
全球短訊!請問黃豆醬的做法_黃豆醬的做法和配方
湖南外貿(mào)穩(wěn)健增長
天天熱消息:吃相難看卡通圖_吃相難看深層
X 關(guān)閉
西安警方完成研考安保工作 共出動警力逾1.3萬人次
得知西安疫情防控“升級” 男子夜騎共享單車回咸陽淳化
中國醫(yī)生將任SIU主席背后:從追隨者同行者到引領(lǐng)者
海南省通報政法隊伍教育整頓成果