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

python的getattr和getattribute攔截內(nèi)置操作實(shí)現(xiàn)

 更新時間:2024年01月16日 09:37:36   作者:梯閱線條  
在Python中,getattr和getattribute是用于動態(tài)屬性訪問和自定義屬性訪問行為的重要工具,本文主要介紹了python的getattr和getattribute攔截內(nèi)置操作實(shí)現(xiàn),具有一定的參考價值,感興趣的可以了解一下

1.1 特性描述符getattr(bute)管理屬性比較

描述

特性和描述符,管理屬性時,實(shí)例屬性用前單下劃線開頭,self._attr。

__getattr__(),管理屬性時,未定義屬性的點(diǎn)號運(yùn)算返回已定義屬性的點(diǎn)號運(yùn)算。

__getattribute__(),管理屬性時,用object.__getattribute__(self,name,value),避免循環(huán)。

示例

>>> class SquareCubePro:
    '''
        property 特性計(jì)算平方和立方
        前下化線開頭屬性名存儲基礎(chǔ)數(shù)據(jù)
        賦值為特性的屬性名不帶下劃線
        self._square和square=property:
        實(shí)例屬性和特性屬性不能同名,避免循環(huán)
    '''
    def __init__(self,sq,cu):
        self._square=sq
        self._cube=cu
    def getSquare(self):
        return self._square**2
    def setSquare(self,value):
        self._square=value
    square=property(getSquare,setSquare)
    
    def getCube(self):
        return self._cube**3
    cube=property(getCube)

    
>>> scp=SquareCubePro(2,3)
>>> scp.square,scp.cube
(4, 27)
>>> scp=SquareCubePro(3,5)
>>> scp.square,scp.cube
(9, 125)
>>> scp.square=5
>>> scp.square
25



>>> class SquareDesc:
    '''
        Descriptor 描述符計(jì)算平方和立方
        基礎(chǔ)數(shù)據(jù)存儲在客戶類實(shí)例的屬性上
    '''
    def __get__(self,instance,owner):
        return instance._square**2
    def __set__(self,instance,value):
        instance._square=value

        
>>> class CubeDesc:
    def __get__(self,instance,owner):
        return instance._cube**3

    
>>> class SquareCubeDesc:
    sq=SquareDesc()
    cu=CubeDesc()
    def __init__(self,sq,cu):
        self._square=sq
        self._cube=cu

        
>>> scd=SquareCubeDesc(3,5)
>>> scd.sq,scd.cu
(9, 125)
>>> scd.sq=5
>>> scd.sq
25

>>> class SquareCubeGetA:
    '''
        重載 __getattr__ 計(jì)算平方和立方
    '''
    def __init__(self,sq,cu):
        self._square=sq
        self._cube=cu
    def __getattr__(self,name):
        if name=='square':
            return self._square**2
        elif name=='cube':
            return self._cube**3
        else:
            raise TypeError('屬性錯誤:',name)
    def __setattr__(self,name,value):
        if name=='square':
            self.__dict__['_square']=value
        else:
            self.__dict__[name]=value

            
>>> scga=SquareCubeGetA(3,5)
>>> scga.square,scga.cube
(9, 125)
>>> scga.square=5
>>> scga.square
25

>>> class SquareCubeGetAB:
    '''
        重載 __getattribute__ 計(jì)算平方和立方
    '''
    def __init__(self,sq,cu):
        self._square=sq
        self._cube=cu
    def __getattribute__(self,name):
        if name=='square':
            return object.__getattribute__(self,'_square')**2
        elif name=='cube':
            return object.__getattribute__(self,'_cube')**3
        else:
            return object.__getattribute__(self,name)
    def __setattr__(self,name,value):
        if name=='square':
            self.__dict__['_square']=value
        else:
            self.__dict__[name]=value

            
>>> scgab=SquareCubeGetAB(3,5)
>>> scgab.square,scgab.cube
(9, 125)
>>> scgab.square=5
>>> scgab.square
25

1.2 getattr和getattribute攔截內(nèi)置操作

python內(nèi)置操作和對應(yīng)方法。

NO內(nèi)置操作對應(yīng)方法
1索引操作[i]__getitem__
2加法(連接)操作+__coerce__ __add__
3括號調(diào)用()__call__
4打印print()__str__

__coerce__:表示強(qiáng)制類型轉(zhuǎn)換,使用加法(或連接)操作+時,不同類型會觸發(fā)類型轉(zhuǎn)換或者報(bào)錯。

1.2.1 S.center(width[, fillchar]) -> string

用法

S.center(width[, fillchar]) -> string

描述

python的s.center()使字符串居中對齊。

S:字符串;

width:字符串寬度;

fillchar:填充字符,字符串長度小于width時生效,否則不生效。

示例

>>> strL=['MyGetAttr','MyGetAttribute']
>>> for s in strL:
    print('\n'+s.center(50,'='))
    print('test center')

====================MyGetAttr=====================
test center

==================MyGetAttribute==================
test center

1.2.2 testgetattr.py

# encoding:utf-8

class MyGetAttr:
    name='梯閱線條'
    def __init__(self):
        self.url='tyxt.work'
    def __len__(self):
        print('__len__:9555')
        return 9555
    def __getattr__(self,attr):
        print('__getattr__:'+attr)
        if attr == '__str__':
            return lambda *args:'[GetAttr str]'
        else:
            return lambda *args:None

        
class MyGetAttribute(object):
    name='梯閱線條'
    def __init__(self):
        self.url='tyxt.work'
    def __len__(self):
        print('__len__:9555')
        return 9555
    def __getattribute__(self,attr):
        print('__getattribute__:'+attr)
        if attr == '__str__':
            return lambda *args:'[Getattribute str]'
        else:
            return lambda *args:None

if __name__=='__main__':     
    import sys
    print('python '+sys.version.split()[0])
    for C in MyGetAttr,MyGetAttribute:
        print('\n'+C.__name__.center(50,'='))
        c1=C()
        c1.name
        c1.url
        c1.tel
        len(c1)
        try:
            c1[0]
        except:
            print('fail []')
        try:
            c1+99
        except:
            print('fail +')
        try:
            c1()
        except:
            print('fail ()')
        c1.__call__()
        print(c1.__str__())
        print(c1)

1.2.3 python2.x的getattr和getattribute攔截內(nèi)置操作

python2.x的__getattr__()攔截未定義屬性操作,包括當(dāng)前類內(nèi)未定義的seq[i]、+、()、print()等內(nèi)置操作。

python2.x的__getattribute__()攔截全部屬性的點(diǎn)號運(yùn)算、賦值運(yùn)算、刪除屬性,不攔截當(dāng)前類內(nèi)未定義的seq[i]、+、()、print()等內(nèi)置操作。

NO調(diào)用方式是否被__getattr__()攔截是否被__ getattribute __()攔截
1print(實(shí)例名)被攔截不被攔截
2實(shí)例名.__str__()被攔截被攔截
3實(shí)例名()被攔截不被攔截
4實(shí)例名.__call__()被攔截被攔截
5[]、+被攔截不被攔截

在cmd執(zhí)行結(jié)果如下:

C:\Users\Administrator>D:\Python27\python.exe E:\documents\F盤\testgetattr.py
python 2.7.18

====================MyGetAttr=====================
__getattr__:tel
__len__:9555
__getattr__:__getitem__
__getattr__:__coerce__
__getattr__:__add__
__getattr__:__call__
__getattr__:__call__
__getattr__:__str__
[GetAttr str]
__getattr__:__str__
[GetAttr str]

==================MyGetAttribute==================
__getattribute__:name
__getattribute__:url
__getattribute__:tel
__len__:9555
fail []
fail +
fail ()
__getattribute__:__call__
__getattribute__:__str__
[Getattribute str]
<__main__.MyGetAttribute object at 0x00000000034B7C88>

1.2.4 python3.x的getattr和getattribute攔截內(nèi)置操作

python3.x的__getattr__()攔截未定義屬性操作,不攔截當(dāng)前類內(nèi)未定義的seq[i]、+、()、print()等內(nèi)置操作。

python3.x的__getattribute__()攔截全部屬性的點(diǎn)號運(yùn)算、賦值運(yùn)算、刪除屬性,不攔截當(dāng)前類內(nèi)未定義的seq[i]、+、()、print()等內(nèi)置操作。

python3.x中,MyGetAttr未定義__str__(),但都未被__getattr__()攔截,因?yàn)閺膐bject繼承了__str__()方法,所以不會被攔截。通過hasattr(MyGetAttr,‘__str__’)返回True驗(yàn)證。

python3.x中,MyGetAttribute未定義__str__(),通過print()打印不會被攔截,顯式調(diào)用會被攔截。

python3.x中,調(diào)用小括號(),即__call__,不會被__getattr__()和__getattribute__()攔截,顯式調(diào)用會被攔截。

NO調(diào)用方式是否被__getattr__()攔截是否被__ getattribute __()攔截
1print(實(shí)例名)不被攔截不被攔截
2實(shí)例名.__str__()不被攔截被攔截
3實(shí)例名()不被攔截不被攔截
4實(shí)例名.__call__()被攔截被攔截
5[]、+不被攔截不被攔截

在cmd執(zhí)行結(jié)果如下:

C:\Users\Administrator>D:\Python3\python.exe E:\documents\F盤\testgetattr.py
python 3.7.8

====================MyGetAttr=====================
__getattr__:tel
__len__:9555
fail []
fail +
fail ()
__getattr__:__call__
<__main__.MyGetAttr object at 0x01648E10>
<__main__.MyGetAttr object at 0x01648E10>

==================MyGetAttribute==================
__getattribute__:name
__getattribute__:url
__getattribute__:tel
__len__:9555
fail []
fail +
fail ()
__getattribute__:__call__
__getattribute__:__str__
[Getattribute str]
<__main__.MyGetAttribute object at 0x01648F50>

到此這篇關(guān)于python的getattr和getattribute攔截內(nèi)置操作實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)python的getattr和getattribute攔截內(nèi)置內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • python安裝包出現(xiàn)SSL證書驗(yàn)證失敗?的問題及解決方式

    python安裝包出現(xiàn)SSL證書驗(yàn)證失敗?的問題及解決方式

    安裝modelscope時SSL證書驗(yàn)證失敗,原因?yàn)榇碓O(shè)置干擾了連接,關(guān)閉代理后成功安裝,說明代理可能影響SSL握手,建議排查代理配置,優(yōu)先嘗試關(guān)閉代理解決此類問題
    2025-08-08
  • 詳解使用Pytorch Geometric實(shí)現(xiàn)GraphSAGE模型

    詳解使用Pytorch Geometric實(shí)現(xiàn)GraphSAGE模型

    這篇文章主要為大家介紹了詳解使用Pytorch Geometric實(shí)現(xiàn)GraphSAGE模型示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-04-04
  • Python包管理利器之pip命令的安裝與使用入門指南

    Python包管理利器之pip命令的安裝與使用入門指南

    pip是Python的包管理工具,全稱為"Pip?Installs?Packages",是Python生態(tài)系統(tǒng)中最重要的工具之一,下面就跟隨小編一起深入了解下pip命令的安裝與使用吧
    2025-04-04
  • 關(guān)于python中第三方庫交叉編譯的問題

    關(guān)于python中第三方庫交叉編譯的問題

    這篇文章主要介紹了python及第三方庫交叉編譯,通過交叉編譯工具,我們就可以在CPU能力很強(qiáng)、存儲控件足夠的主機(jī)平臺上(比如PC上)編譯出針對其他平臺的可執(zhí)行程序,需要的朋友可以參考下
    2022-09-09
  • python之鏈表的反轉(zhuǎn)方式

    python之鏈表的反轉(zhuǎn)方式

    這篇文章主要介紹了python之鏈表的反轉(zhuǎn)方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • Python在實(shí)時數(shù)據(jù)流處理中集成Flink與Kafka

    Python在實(shí)時數(shù)據(jù)流處理中集成Flink與Kafka

    隨著大數(shù)據(jù)和實(shí)時計(jì)算的興起,實(shí)時數(shù)據(jù)流處理變得越來越重要,Flink和Kafka是實(shí)時數(shù)據(jù)流處理領(lǐng)域的兩個關(guān)鍵技術(shù),下面我們就來看看如何使用Python將Flink和Kafka集成在一起吧
    2025-03-03
  • 人工智能學(xué)習(xí)Pytorch教程Tensor基本操作示例詳解

    人工智能學(xué)習(xí)Pytorch教程Tensor基本操作示例詳解

    這篇文章主要為大家介紹了人工智能學(xué)習(xí)Pytorch教程Tensor的基本操作示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步
    2021-11-11
  • Python解析Excel圖表Chart的信息實(shí)戰(zhàn)指南

    Python解析Excel圖表Chart的信息實(shí)戰(zhàn)指南

    在數(shù)據(jù)分析與報(bào)表自動化場景中,Excel圖表往往承載著關(guān)鍵業(yè)務(wù)信息,本文將基于OpenXML規(guī)范,通過將.xlsx文件視為ZIP壓縮包,直接解析?xl/charts/chart*.xml,實(shí)現(xiàn)了對?Excel?圖表元數(shù)據(jù)的精準(zhǔn)提取,感興趣的小伙伴可以了解下
    2026-01-01
  • 十條建議幫你提高Python編程效率

    十條建議幫你提高Python編程效率

    這篇文章主要為大家介紹了十條建議,可以幫你提高Python編程效率的10條,想要提升提高Python編程效率的朋友不要錯過
    2016-02-02
  • Python使用random.shuffle()隨機(jī)打亂字典排序

    Python使用random.shuffle()隨機(jī)打亂字典排序

    本文主要介紹了Python使用random.shuffle()隨機(jī)打亂字典排序,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-08-08

最新評論

徐水县| 建昌县| 施秉县| 濮阳县| 济源市| 长子县| 甘泉县| 庄河市| 克东县| 安泽县| 饶平县| 山东省| 五大连池市| 克东县| 康定县| 波密县| 湖北省| 阜平县| 铜川市| 浙江省| 宝丰县| 台北市| 遵义县| 金湖县| 齐齐哈尔市| 鄂州市| 游戏| 新兴县| 南宁市| 安宁市| 大连市| 南皮县| 灵石县| 卢氏县| 泉州市| 来安县| 武冈市| 十堰市| 海南省| 托克逊县| 三明市|