91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

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

發布時間:2020-09-08 09:39:18 來源:億速云 閱讀:230 作者:小新 欄目:編程語言

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

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

__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類,設置一個實例屬性為x,值為1。obj為這個類的實例,獲取obj.x返回1,而獲取obj.y發現屬性找不到,原因是obj的實例變量中不包含y,找不到某屬性時會調用__getattr__方法。

**調用__getattr__詳細過程如下:**

obj.attr

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

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

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

4.調用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__魔法方法

當我們調用對象的屬性時,首先會調用__getattribute__魔法方法。

obj.x
obj.__getattribute__(x)

如上代碼,這兩個代碼其實是等價的。當__getattribute__查找失敗,就會去調用__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__魔法方法時,要返回父類的方法,不然很難寫對,下面代碼是一個陷阱,會產生無限遞歸。

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

上面的代碼看起來似乎是對的,但卻調入了無限遞歸的陷阱,相當于

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

要十分警惕。

另外,內置的getattr和hasattr也會觸發這個魔法方法。

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

其他細節需要注意

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和一個實例屬性x,這兩個屬性同名,根據Python語法規則,當對象獲取屬性x的時候,首先會在實例屬性中尋找,如果找不到才回去類屬性中查找。

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

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

感謝你能夠認真閱讀完這篇文章,希望小編分享Python魔法方法之__getattr__和getattribute是什么內容對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業資訊頻道,遇到問題就找億速云,詳細的解決方法等著你來學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

南通市| 紫阳县| 贺兰县| 安徽省| 大厂| 焦作市| 伊川县| 景东| 上林县| 水城县| 搜索| 来宾市| 南和县| 衡阳市| 科技| 将乐县| 山丹县| 神木县| 龙井市| 林甸县| 鄢陵县| 深州市| 扎鲁特旗| 罗定市| 高碑店市| 布尔津县| 岐山县| 武胜县| 新野县| 乐山市| 克东县| 青铜峡市| 永靖县| 武定县| 新乡县| 岱山县| 诏安县| 灵石县| 淮滨县| 孟连| 泊头市|