Python 裝飾器重載內建操作

Mondo 科技 更新 2024-01-30

python2.x 和 python3 的現代類所有具有內建動作表示式呼叫的 x 類都不會觸發 getattr(和 getattribute)(參見 Python 的 getattr 和 getattribute 攔截內建操作)。

強制:表示強制型別轉換,當您使用加法(或連線)操作+時,不同的型別會觸發型別轉換或報錯。

內建操作呼叫模式:隱式呼叫,即呼叫表示式; 顯式呼叫,這是被呼叫方法的名稱。

描述:

內建操作的表示式呼叫在 python3 中不可用0 個委託,因為不會觸發 getattr(和 getattribute)

>>def tracecall(*args):跟蹤呼叫。 

if trace:

print('['+','.join(map(str,args))+']')

>def accessctrl(forbid):

def ondecorator(acls):

class oninstance:

def __init__(self,*args,**kargs):

self.__wrapped=acls(*args,**kargs)

def __getattr__(self,attr):

tracecall('getattr',attr)

if forbid(attr):

raise typeerror('禁止訪問:'+attr)

else:return getattr(self.__wrapped,attr)

def __setattr__(self,attr,value):

tracecall('setattr',attr,value)

壓縮變數命名為 oninstance wrapped

if attr=='_oninstance__wrapped':

self.__dict__[attr]=value

elif forbid(attr):

raise typeerror('禁止設定:'+attr)

else:setattr(self.__wrapped,attr,value)

return oninstance

return ondecorator

>def privateattr(*privates):

return accessctrl(forbid=(lambda attr:attr in privates))

>privateattr('phone')

class staff_private:

def __init__(self,name,phone):

self.name=name

self.phone=phone

def __str__(self):

return '員工私人>電話號碼:'+str(self.phone)

def __add__(self,num):

self.phone+=num

python2.x 執行py2 的 getattr (截獲對 print() 和 + 等內建操作的表示式呼叫,並正確地委託給裝飾物件。

#python2.x 執行

>trace=true

>sp1=staff_private('梯形圖讀取線',110)

setattr,oninstance 包裝,員工私人>電話號碼:110]。

py2 遺留類攔截內建操作表示式呼叫 - 隱式呼叫、print()。

>print(sp1)

getattr,__str__]

員工私人>電話號碼:110

py2 傳統類攔截內建操作表示式呼叫 - 隱式呼叫,+

>sp1+1

getattr,__coerce__]

getattr,__add__]

>print(sp1)

getattr,__str__]

員工私人>電話號碼:111

python3.x 執行py3 的 getattr(它不會攔截對 print() 和 + 等內建操作的表示式呼叫),不能委託給裝飾物件。

#python3.x 執行

>trace=true

>sp1=staff_private('梯形圖讀取線',110)

setattr,oninstance 包裝,員工私人>電話號碼:110]。

py3 不會攔截內建操作列印

>print(sp1)

_main__.accessctrl..ondecorator..oninstance object at 0x0000019736c2f4f0>

py3 不攔截內建操作 +

>sp1+1

traceback (most recent call last):

file "", line 1, in

sp1+1typeerror: unsupported operand type(s) for +:'oninstance' and 'int'

描述:python3.X 的裝飾器重載內建的操作運算子方法,以截獲裝飾類的內建表示式呼叫。

例如,過載 str (intercept print(), add (intercept +.

>>def tracecall(*args):跟蹤呼叫。 

if trace:

print('['+','.join(map(str,args))+']')

>def accessctrl(forbid):

def ondecorator(acls):

class oninstance:

def __init__(self,*args,**kargs):

self.__wrapped=acls(*args,**kargs)

def __getattr__(self,attr):

tracecall('getattr',attr)

if forbid(attr):

raise typeerror('禁止訪問:'+attr)

else:return getattr(self.__wrapped,attr)

def __setattr__(self,attr,value):

tracecall('setattr',attr,value)

壓縮變數命名為 oninstance wrapped

if attr=='_oninstance__wrapped':

self.__dict__[attr]=value

elif forbid(attr):

raise typeerror('禁止設定:'+attr)

else:setattr(self.__wrapped,attr,value)

print() 觸發 str (

def __str__(self):

tracecall('oninstance,__str__')

str() 觸發 str(

return str(self.__wrapped)

+ 觸發器新增 (

def __add__(self,other):

tracecall('oninstance,__add__',other)

return self.__wrapped+other

return oninstance

return ondecorator

>def privateattr(*privates):

return accessctrl(forbid=(lambda attr:attr in privates))

>privateattr('phone')

class staff_private:

def __init__(self,name,phone):

self.name=name

self.phone=phone

def __str__(self):

tracecall('staff_private,__str__')

return '員工私人>電話號碼:'+str(self.phone)

def __add__(self,num):

tracecall('staff_private,__add__',num)

self.phone+=num

>trace=true

>sp1=staff_private('梯形圖讀取線',110)

staff private, str ] tracecall call print() 觸發 str (

setattr,oninstance 包裝,員工私人>電話號碼:110]。

print() 觸發 str (

>print(sp1)

oninstance,__str__]

staff_private,__str__]

員工私人>電話號碼:110

+ 觸發器新增 (

>sp1+1

oninstance,__add__,1]

staff_private,__add__,1]

>print(sp1)

oninstance,__str__]

staff_private,__str__]

員工私人>電話號碼:111

相關問題答案

    Python 函式裝飾器儲存資訊

    Python 函式裝飾器可以通過例項屬性 全域性變數 非區域性變數和函式屬性來儲存修飾函式的狀態資訊。描述 通過裝飾器統計函式呼叫次數,並通過列印跟蹤呼叫歷史記錄。此裝飾器是使用類的 call 方法實現的。 裝飾器返回例項物件 建構函式初始化呼叫次數為,並記錄傳入的修飾函式 過載呼叫 方法,每次呼叫...

    Python中魔法的奧秘 裝飾器和閉包的解密

    Python是一種神奇的程式語言,它的魅力不僅體現在它簡潔的語法和強大的標準庫上,還體現在它靈活強大的高階功能上。在本文中,我們將深入探討 Python 的兩個神秘功能,裝飾器和閉包,並揭示它們的工作原理和使用方式。.裝飾器的基礎。..什麼是裝飾器?裝飾器是 Python 中一種特殊型別的函式,可用...

    如何選擇裝飾材料?裝飾材料的選擇及其應用

    在裝修設計過程中,裝修材料的選擇是最重要的環節之一。選擇建築材料時需要考慮幾個因素。這包括對裝飾預算 設計要求和整體風格的考慮。這裡有一些建議可以幫助您更好地選擇裝飾材料。.考慮你的裝修預算。不同的裝修材料 差異很大,所以首先要做的就是確定你的預算。在保證質量和環保的前提下,根據預算選擇最有選擇性的...

    格柵上裝飾什麼好? 格柵裝飾指南

    作為家居裝飾的元素之一,格柵不僅起到了實用的分隔作用,還增加了室內美感。以下是不同格柵裝飾的一些提示和技巧。一 裝飾格柵的原理 .統一風格 裝潢應與室內的整體風格相協調。.功能合適 考慮格柵的實際功能,選擇合適的裝飾。.個性表達 體現個人品味和生活態度。二 不同型別格柵裝飾 .木格柵 植物裝飾 攀緣...

    裝飾工程造價 裝飾裝修工程施工

    裝飾工程材料。.飾面材料。.飾面石材。 天然飾面石材。 花崗岩板。花崗岩板是花崗岩經鋸切 研磨 切割等工藝製成。花崗岩板堅硬緻密,抗壓強度高,耐磨性優良,化學穩定性好,不易風化,耐久性好 但是,由於花崗岩中含有石英,在高溫下會發生晶型轉變,導致體積膨脹,因此,花崗岩板的耐火性較差。根據現行國家標準 ...