這篇文章主要介紹了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是什么內容對大家有幫助,同時也希望大家多多支持創新互聯,關注創新互聯行業資訊頻道,遇到問題就找創新互聯,詳細的解決方法等著你來學習!
當前題目:Python魔法方法之__getattr__和getattribute是什么
網站地址:http://vcdvsql.cn/article36/pcoosg.html
成都網站建設公司_創新互聯,為您提供用戶體驗、Google、手機網站建設、服務器托管、微信公眾號、品牌網站制作
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯