国产xxxxx在线观看_无码A片免费视频完整版_亚洲国产美女精品久久久久∴_最近2019年中文字幕免费下载_色欲网天天无码AV日韩

首頁(yè) 資訊 財(cái)經(jīng) 公益 彩店 奇聞 速遞 體育 提點(diǎn) 資訊 綜合 企業(yè) 市場(chǎng)

首頁(yè)
你現(xiàn)在的位置:

Python面向?qū)ο缶幊?魔術(shù)方法-__call__和__getattr__方法-世界報(bào)資訊

2023-04-22 17:21:35    來(lái)源:騰訊云    作者:

Python中的魔術(shù)方法__call__和__getattr__方法是用于實(shí)現(xiàn)對(duì)象可調(diào)用和屬性訪問(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ì)象:

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í)例化過(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ì)象屬性訪問(wèn)的魔術(shù)方法。當(dāng)我們使用點(diǎn)運(yùn)算符訪問(wèn)一個(gè)對(duì)象的屬性時(shí),如果該屬性不存在,Python會(huì)自動(dòng)調(diào)用該對(duì)象的__getattr__方法,并將屬性名稱作為參數(shù)傳遞給__getattr__方法。因此,我們可以在__getattr__方法中實(shí)現(xiàn)自定義的屬性訪問(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類,其中__getattr__方法用于實(shí)現(xiàn)動(dòng)態(tài)屬性訪問(wèn)。當(dāng)我們使用點(diǎn)運(yùn)算符訪問(wè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ì)象屬性訪問(wèn)行為。

需要注意的是,__getattr__方法只有在對(duì)象的屬性不存在時(shí)才會(huì)被觸發(fā),因此我們可以在__getattr__方法中實(shí)現(xiàn)對(duì)特定屬性的自定義處理邏輯。同時(shí),getattr__方法也可以與其他屬性訪問(wèn)方法(如__getattribute__和__setattr)結(jié)合使用,從而實(shí)現(xiàn)更加靈活的對(duì)象屬性訪問(wèn)和修改行為。

綜上所述,__call__和__getattr__方法是Python中重要的魔術(shù)方法,用于實(shí)現(xiàn)對(duì)象的可調(diào)用行為和屬性訪問(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類,其中__call__方法用于為對(duì)象動(dòng)態(tài)添加屬性,__getattr__方法用于實(shí)現(xiàn)對(duì)象的動(dòng)態(tài)屬性訪問(wèn)。在DynamicObject類的實(shí)例化過(guò)程中,我們創(chuàng)建了一個(gè)名為_(kāi)attrs的字典,用于存儲(chǔ)對(duì)象的屬性。然后,我們使用()運(yùn)算符調(diào)用DynamicObject對(duì)象,傳遞屬性名稱和屬性值作為參數(shù),從而動(dòng)態(tài)添加屬性。最后,我們使用點(diǎn)運(yùn)算符訪問(wèn)DynamicObject對(duì)象的屬性,并使用__getattr__方法實(shí)現(xiàn)屬性訪問(wèn)行為。

需要注意的是,在這個(gè)例子中,我們使用了下劃線開(kāi)頭的屬性名稱,以表示這些屬性是私有的。這是因?yàn)樵赑ython中,如果屬性名稱以一個(gè)或多個(gè)下劃線開(kāi)頭,則表示該屬性是私有的,應(yīng)該避免直接訪問(wèn)該屬性。如果需要訪問(wèn)私有屬性,可以使用訪問(wèn)器方法(如getter和setter方法)來(lái)實(shí)現(xiàn)。

編輯:qysb005

標(biāo)簽:

中國(guó)企業(yè)新聞網(wǎng)版權(quán)與免責(zé)聲明:
1、中國(guó)企業(yè)新聞網(wǎng)所有內(nèi)容的版權(quán)均屬于作者或頁(yè)面內(nèi)聲明的版權(quán)人。未經(jīng)中國(guó)企業(yè)新聞網(wǎng)的書(shū)面許可, 任何其他個(gè)人或組織均不得以任何形式將河南企業(yè)網(wǎng)的各項(xiàng)資源轉(zhuǎn)載、復(fù)制、編輯或發(fā)布使用于其他任何場(chǎng)合;不得把其中任何形式的資訊散發(fā)給其他方, 不可把這些信息在其他的服務(wù)器或文檔中作鏡像復(fù)制或保存;不得修改或再使用中國(guó)企業(yè)新聞網(wǎng)的任何資源。若有意轉(zhuǎn)載本站信息資料, 必需取得中國(guó)企業(yè)新聞網(wǎng)書(shū)面授權(quán)。否則將追究其法律責(zé)任。
2、已經(jīng)本網(wǎng)授權(quán)使用作品的,應(yīng)在授權(quán)范圍內(nèi)使用,并注明“來(lái)源:中國(guó)企業(yè)新聞網(wǎng)”。違反上述聲明者,本網(wǎng)將追究其相關(guān)法律責(zé)任。
3、凡本網(wǎng)注明“來(lái)源:XXX(非中國(guó)企業(yè)新聞網(wǎng))”的作品,均轉(zhuǎn)載自其它媒體,轉(zhuǎn)載目的在于傳遞更多信息, 并不代表本網(wǎng)贊同其觀點(diǎn)和對(duì)其真實(shí)性負(fù)責(zé)。本網(wǎng)轉(zhuǎn)載其他媒體之稿件,意在為公眾提供免費(fèi)服務(wù)。如稿件版權(quán)單位或個(gè)人不想在本網(wǎng)發(fā)布, 可與本網(wǎng)聯(lián)系,本網(wǎng)視情況可立即將其撤除。
圖片欣賞
頻道推薦
內(nèi)容推薦
最近更新