欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

Python魔法方法之__getattr__和getattribute是什么

這篇文章主要介紹了Python魔法方法之__getattr__和getattribute是什么,具有一定借鑒價值,需要的朋友可以參考下。希望大家閱讀完這篇文章后大有收獲。下面讓小編帶著大家一起了解一下。

讓客戶滿意是我們工作的目標(biāo),不斷超越客戶的期望值來自于我們對這個行業(yè)的熱愛。我們立志把好的技術(shù)通過有效、簡單的方式提供給客戶,將通過不懈努力成為客戶在信息化領(lǐng)域值得信任、有價值的長期合作伙伴,公司提供的服務(wù)項目有:域名與空間、網(wǎng)站空間、營銷軟件、網(wǎng)站建設(shè)、伊金霍洛網(wǎng)站維護(hù)、網(wǎng)站推廣。

在Python中有這兩個魔法方法容易讓人混淆:__getattr__和getattribute。通常我們會定義__getattr__而從來不會定義getattribute,下面我們來看看這兩個的區(qū)別。

__getattr__魔法方法

class MyClass:
    def __init__(self, x):
        self.x = x
    def __getattr__(self, item):
        print('{}屬性為找到!'.format(item))
        return None
>>> obj = MyClass(1)
>>> obj.x
1
>>> obj.y
y屬性為找到!
None

我們定義一個MyClass類,設(shè)置一個實(shí)例屬性為x,值為1。obj為這個類的實(shí)例,獲取obj.x返回1,而獲取obj.y發(fā)現(xiàn)屬性找不到,原因是obj的實(shí)例變量中不包含y,找不到某屬性時會調(diào)用__getattr__方法。

**調(diào)用__getattr__詳細(xì)過程如下:**

obj.attr

1.首先會在對象的實(shí)例屬性中尋找,找不到執(zhí)行第二步

2.來到對象所在的類中查找類屬性,如果還找不到執(zhí)行第三步

3.來到對象的繼承鏈上尋找,如果還找不到執(zhí)行第四步

4.調(diào)用obj.__getattr__方法,如果用戶沒有定義或者還是找不到,拋出AttributeError異常,屬性查找失??!

class MyClass:
    def __init__(self, x):
        self.x = x
>>> obj = MyClass(1)
>>> obj.y
AttributeError: 'MyClass' object has no attribute 'a'

如上代碼,沒有定義__getattr__魔法方法,又找不到屬性,就會拋出異常。

__getattribute__魔法方法

當(dāng)我們調(diào)用對象的屬性時,首先會調(diào)用__getattribute__魔法方法。

obj.x
obj.__getattribute__(x)

如上代碼,這兩個代碼其實(shí)是等價的。當(dāng)__getattribute__查找失敗,就會去調(diào)用__getattr__方法。

代碼演示

class MyClass:
    def __init__(self, x):
        self.x = x
    def __getattribute__(self, item):
        print('正在獲取屬性{}'.format(item))
        return super(MyClass, self).__getattribute__(item)
>>> obj = MyClass(2)
>>> obj.x
正在獲取屬性x
2

我們使用__getattribute__魔法方法時,要返回父類的方法,不然很難寫對,下面代碼是一個陷阱,會產(chǎn)生無限遞歸。

class MyClass:
    def __init__(self, x):
        self.x = x
    def __getattribute__(self, item):
        print('正在獲取屬性{}'.format(item))
        return self.item
        
>>> obj = MyClass(2)
>>> obj.x
  File "xxx", line 11, in __getattribute__
    print('正在獲取屬性{}'.format(item))
RecursionError: maximum recursion depth exceeded while calling a Python object

上面的代碼看起來似乎是對的,但卻調(diào)入了無限遞歸的陷阱,相當(dāng)于

def __getattribute__(self, item):
    print('正在獲取屬性{}'.format(item))
    return self.__getattribute__(item)

要十分警惕。

另外,內(nèi)置的getattr和hasattr也會觸發(fā)這個魔法方法。

>>> getattr(obj, 'x', None)
正在獲取屬性x
2
>>> hasattr(obj, 'x', None)
正在獲取屬性x
True

其他細(xì)節(jié)需要注意

class MyClass:
    x = 999
    
    def __init__(self, x):
        self.x = x
    def __getattribute__(self, item):
        print('正在獲取屬性{}'.format(item))
        return super(MyClass, self).__getattribute__(item)

上面代碼中,定義了一個類屬性x和一個實(shí)例屬性x,這兩個屬性同名,根據(jù)Python語法規(guī)則,當(dāng)對象獲取屬性x的時候,首先會在實(shí)例屬性中尋找,如果找不到才回去類屬性中查找。

>>> obj = MyClass(2)
>>> print(obj.x)
正在獲取屬性x
2
>>> del obj.x  #刪除了實(shí)例屬性x
>>> print(obj.x)  #此時訪問的是類屬性
正在獲取屬性
999

這樣就能印證了上面所說__getattribute__的查找順序。通常該方法在框架中可能會用到,一般情況下無需使用。

感謝你能夠認(rèn)真閱讀完這篇文章,希望小編分享Python魔法方法之__getattr__和getattribute是什么內(nèi)容對大家有幫助,同時也希望大家多多支持創(chuàng)新互聯(lián),關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,遇到問題就找創(chuàng)新互聯(lián),詳細(xì)的解決方法等著你來學(xué)習(xí)!

當(dāng)前題目:Python魔法方法之__getattr__和getattribute是什么
網(wǎng)站地址:http://www.aaarwkj.com/article36/pcoosg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供用戶體驗、Google手機(jī)網(wǎng)站建設(shè)、服務(wù)器托管微信公眾號、品牌網(wǎng)站制作

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

微信小程序開發(fā)
免费在线观看美女av| 国产日韩欧美一区二区三区四区| 尤物视频在线观看羞羞| 欧美三级影院网上在线| 日韩精品中文一区二区| 中文字幕免费不卡一区| 国产又粗又猛又爽黄老大爷 | 欧美丰满人妻少妇视频在线| 国产乱码精品一区二区三区爽爽爽| 天天操操操操操操夜夜爽| 亚洲国产综合亚洲综合国产| 91成人大片在线观看| 精品国产欧美成人一区| 麻豆人妻性色av专区| 欧美在线观看香蕉视频| 亚洲男人天堂超碰在线| 高清欧美一区二区三区日本| 亚洲婷婷久久一区二区| 久久免费少妇高潮99精品| 久久久久久成人亚洲| 国产国语激情对白在线| 国产亚洲av麻豆精品推荐| 丰满人妻被黑人猛烈进入| 国产国产乱老熟视频网站| 不卡在线视频中文字幕| 人妻一区二区免费视频| 国产传媒网站在线观看| 成人一区二区三区播放| 亚洲老司机深夜福利| 国产伦精品一区二区三区免费视频| 高颜值紧身牛仔裤国产精品| 91麻豆精品国产91久| av天堂久久这里只有精品美国| 亚洲av正片一区二区三区| 蜜桃免费观看在线视频| 九七青青草视频在线观看| 久久精品国产久精国产爱| 国产精品一区二区黑人巨大| 亚洲国产精品热久久网站| 欧美影院波波在线影院| 成人一区二区三区乱码|