日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

Python 属性__getattribute__

發布時間:2023/11/28 生活经验 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Python 属性__getattribute__ 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

首先理解__getattribute__的用法,先看代碼:

class Tree(object):def __init__(self,name):self.name = nameself.cate = "plant"def __getattribute__(self,obj):print("哈哈")return object.__getattribute__(self,obj)
aa = Tree("大樹")
print(aa.name)

執行結果是:

哈哈
大樹

為什么會這個結果呢?
__getattribute__是屬性訪問攔截器,就是當這個類的屬性被訪問時,會自動調用類的__getattribute__方法。即在上面代碼中,當我調用實例對象aa的name屬性時,不會直接打印,而是把name的值作為實參傳進__getattribute__方法中(參數obj是我隨便定義的,可任意起名),經過一系列操作后,再把name的值返回。Python中只要定義了繼承object的類,就默認存在屬性攔截器,只不過是攔截后沒有進行任何操作,而是直接返回。所以我們可以自己改寫__getattribute__方法來實現相關功能,比如查看權限、打印log日志等。如下代碼,簡單理解即可:

class Tree(object):def __init__(self,name):self.name = nameself.cate = "plant"def __getattribute__(self,*args,**kwargs):if args[0] == "大樹"print("log 大樹")return "我愛大樹"else:return object.__getattribute__(self,*args,**kwargs)
aa = Tree("大樹")
print(aa.name)
print(aa.cate)

結果是:

log 大樹
我愛大樹
plant

另外,注意注意:
初學者用__getattribute__方法時,容易栽進這個坑,什么坑呢,直接看代碼:

class Tree(object):def __init__(self,name):self.name = nameself.cate = "plant"def __getattribute__(self,obj):if obj.endswith("e"):return object.__getattribute__(self,obj)else:return self.call_wind()def call_wind(self):return "樹大招風"
aa = Tree("大樹")
print(aa.name)#因為name是以e結尾,所以返回的還是name,所以打印出"大樹"
print(aa.wind)#這個代碼中因為wind不是以e結尾,#所以返回self.call_wind的結果,打印的是"樹大招風"

上面的解釋正確嗎?
先說結果,關于print(aa.name)的解釋是正確的,但關于print(aa.wind)的解釋不對,為什么呢?我們來分析一下,執行aa.wind時,先調用__getattribute__方法,經過判斷后,它返回的是self.call_wind(),即self.call_wind的執行結果,但當去調用aa這個對象的call_wind屬性時,前提是又要去調用__getattribute__方法,反反復復,沒完沒了,形成了遞歸調用且沒有退出機制,最終程序就掛了!

總結

以上是生活随笔為你收集整理的Python 属性__getattribute__的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。