最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python裝飾器重載內置的使用

 更新時間:2024年01月16日 09:46:14   作者:梯閱線條  
本文主要介紹了Python裝飾器重載內置的使用,詳細介紹如何創(chuàng)建裝飾器,如何使用裝飾器來重載內置函數(shù),具有一定的參考價值,感興趣的可以了解一下

python2.x的新式類和python3.x的全部類,內置操作表達式調用,不會觸發(fā)__getattr__()和__getattribute__()。參考《python的getattr和getattribute攔截內置操作》。

NO內置操作表達式(隱式調用)對應方法(顯式調用)
1索引操作[i]__getitem__
2加法(連接)操作+__coerce__ __add__
3括號調用()__call__
4打印print()__str__

__coerce__:表示強制類型轉換,使用加法(或連接)操作+時,不同類型會觸發(fā)類型轉換或者報錯。

內置操作調用方式:隱式調用,即調用表達式;顯式調用,即調用方法名。

1.1 Py3內置操作表達式調用無法委托

描述

內置操作的表達式調用,無法在python3.0下委托,因為不會觸發(fā)__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 'Staff_Private->手機號:'+str(self.phone)
    def __add__(self,num):
        self.phone+=num

Python2.x執(zhí)行

Py2的__getattr__()攔截print()和+等內置操作的表達式調用,正確的委托給裝飾對象。

#python2.x執(zhí)行
>>> trace=True
>>> sp1=Staff_Private('梯閱線條',110)
[setattr,_onInstance__wrapped,Staff_Private->手機號:110]
#py2傳統(tǒng)類 攔截內置操作表達式調用-隱式調用,print()
>>> print(sp1)
[getattr,__str__]
Staff_Private->手機號:110
#py2傳統(tǒng)類 攔截內置操作表達式調用-隱式調用,+
>>> sp1+1
[getattr,__coerce__]
[getattr,__add__]
>>> print(sp1)
[getattr,__str__]
Staff_Private->手機號:111

Python3.x執(zhí)行

Py3的__getattr__()不攔截print()和+等內置操作的表達式調用,無法委托給裝飾對象。

#python3.x執(zhí)行
>>> trace=True
>>> sp1=Staff_Private('梯閱線條',110)
[setattr,_onInstance__wrapped,Staff_Private->手機號:110]
#py3沒有攔截內置操作 print
>>> print(sp1)
<__main__.accessCtrl.<locals>.onDecorator.<locals>.onInstance object at 0x0000019736C2F4F0>
#py3沒有攔截內置操作 + 
>>> sp1+1
Traceback (most recent call last):
  File "<pyshell#11>", line 1, in <module>
    sp1+1
TypeError: unsupported operand type(s) for +: 'onInstance' and 'int'

1.2 裝飾器重載內置操作

描述

Python3.x的裝飾器重載內置操作運算符方法,來攔截裝飾類對應的內置表達式調用。

比如,重載__str__()攔截print(),__add__()攔截+。

示例

>>> 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()觸發(fā)__str__()
            def __str__(self):
                traceCall('onInstance,__str__')
                # str()觸發(fā)__str__()
                return str(self.__wrapped)
            # + 觸發(fā) __add__()    
            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 'Staff_Private->手機號:'+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調用print()觸發(fā)__str__()
[setattr,_onInstance__wrapped,Staff_Private->手機號:110]
# print()觸發(fā)__str__()
>>> print(sp1)
[onInstance,__str__]
[Staff_Private,__str__]
Staff_Private->手機號:110
# + 觸發(fā) __add__()
>>> sp1+1
[onInstance,__add__,1]
[Staff_Private,__add__,1]
>>> print(sp1)
[onInstance,__str__]
[Staff_Private,__str__]
Staff_Private->手機號:111

到此這篇關于Python裝飾器重載內置的使用的文章就介紹到這了,更多相關Python裝飾器重載內置內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家! 

相關文章

  • python中base64編碼簡介

    python中base64編碼簡介

    Base64是一種任意二進制到文本字符串的編碼方法,常用于在URL、Cookie、網(wǎng)頁中傳輸少量二進制數(shù)據(jù),Base64是一種用64個字符來表示任意二進制數(shù)據(jù)的方法,這篇文章主要介紹了python中base64編碼,需要的朋友可以參考下
    2022-12-12
  • Python實現(xiàn)數(shù)值積分方式

    Python實現(xiàn)數(shù)值積分方式

    今天小編就為大家分享一篇Python實現(xiàn)數(shù)值積分方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-11-11
  • windows系統(tǒng)中Python多版本與jupyter notebook使用虛擬環(huán)境的過程

    windows系統(tǒng)中Python多版本與jupyter notebook使用虛擬環(huán)境的過程

    這篇文章主要介紹了windows中Python多版本與jupyter notebook中使用虛擬環(huán)境的安裝過程,本文分步驟給大家介紹的非常詳細,具有一定的參考借鑒價值 ,需要的朋友可以參考下
    2019-05-05
  • 詳解Python中with語句的用法

    詳解Python中with語句的用法

    這篇文章主要介紹了Python中with語句的用法,with語句的使用是Python學習過程當中的基礎知識,本文來自于IBM官方技術文檔,需要的朋友可以參考下
    2015-04-04
  • 解決List.append()?在?Python?中不起作用的問題

    解決List.append()?在?Python?中不起作用的問題

    在?Python?中,我們通常使用?List.append()?方法向列表末尾添加元素,然而,在某些情況下,你可能會遇到?List.append()?方法不起作用的問題,本文將詳細討論這個問題并提供解決方法,需要的朋友可以參考下
    2023-06-06
  • Python設計模式之外觀模式實例詳解

    Python設計模式之外觀模式實例詳解

    這篇文章主要介紹了Python設計模式之外觀模式,結合實例形式詳細分析了外觀模式的概念、原理、用法及相關操作注意事項,需要的朋友可以參考下
    2019-01-01
  • python使用鎖訪問共享變量實例解析

    python使用鎖訪問共享變量實例解析

    這篇文章主要介紹了python使用鎖訪問共享變量實例解析,分享了相關代碼示例,小編覺得還是挺不錯的,具有一定借鑒價值,需要的朋友可以參考下
    2018-02-02
  • Python實現(xiàn)對桌面進行實時捕捉畫面的方法詳解

    Python實現(xiàn)對桌面進行實時捕捉畫面的方法詳解

    最近在研究目標檢測方面的小東西,需要到對桌面進行實時捕捉畫面。所以本文來用Python實現(xiàn)簡單的對桌面進行實時捕捉畫面,感興趣的可以了解一下
    2023-01-01
  • Python制作一個隨機抽獎小工具的實現(xiàn)

    Python制作一個隨機抽獎小工具的實現(xiàn)

    最近在工作中面向社群玩家組織了一場活動,需要進行隨機抽獎,就做了一個簡單的隨機抽獎小工具。具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-07-07
  • python中get和post有什么區(qū)別

    python中get和post有什么區(qū)別

    在本篇內容里小編給大家分享的是關于python中get和post有什么區(qū)別的相關內容,需要的朋友們參考下吧。
    2020-06-06

最新評論

鄂托克前旗| 涿州市| 神木县| 镇赉县| 绵阳市| 浮山县| 辛集市| 安宁市| 合江县| 博湖县| 漳平市| 深州市| 八宿县| 开阳县| 宁乡县| 漳平市| 温宿县| 辰溪县| 章丘市| 廉江市| 安塞县| 瑞昌市| 吴桥县| 田东县| 德化县| 盐池县| 成武县| 攀枝花市| 美姑县| 胶州市| 鄂伦春自治旗| 临城县| 东光县| 老河口市| 宜君县| 宁海县| 柘城县| 林芝县| 内丘县| 津市市| 连南|