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

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

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

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

描述

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

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

__getattribute__(),管理屬性時(shí),用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('屬性錯(cuò)誤:',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)換,使用加法(或連接)操作+時(shí),不同類型會觸發(fā)類型轉(zhuǎn)換或者報(bào)錯(cuò)。

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

用法

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

描述

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

S:字符串;

width:字符串寬度;

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

示例

>>> 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時(shí)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)方式,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • Python在實(shí)時(shí)數(shù)據(jù)流處理中集成Flink與Kafka

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

    隨著大數(shù)據(jù)和實(shí)時(shí)計(jì)算的興起,實(shí)時(shí)數(shù)據(jù)流處理變得越來越重要,Flink和Kafka是實(shí)時(shí)數(shù)據(jù)流處理領(lǐng)域的兩個(gè)關(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編程效率的朋友不要錯(cuò)過
    2016-02-02
  • Python使用random.shuffle()隨機(jī)打亂字典排序

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

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

最新評論

涞源县| 广德县| 都安| 布拖县| 祁东县| 花莲县| 桃源县| 汶川县| 堆龙德庆县| 高平市| 福清市| 女性| 榆树市| 盘山县| 肇州县| 辽中县| 娄烦县| 海晏县| 无为县| 尚志市| 额敏县| 新河县| 哈密市| 永兴县| 铅山县| 铁岭县| 江陵县| 喀喇沁旗| 六枝特区| 广饶县| 紫阳县| 沂源县| 巫溪县| 东乌珠穆沁旗| 太湖县| 株洲市| 邯郸县| 奉新县| 比如县| 昌黎县| 故城县|