中文字幕理论片,69视频免费在线观看,亚洲成人app,国产1级毛片,刘涛最大尺度戏视频,欧美亚洲美女视频,2021韩国美女仙女屋vip视频

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
python筆記61 - __getattr__ 屬性查找學(xué)習(xí)與使用

前言

object 類里面有個(gè) __getattribute__ 方法,作用是類實(shí)例化調(diào)用屬性和方法的時(shí)候都會(huì)調(diào)用一次,返回該類的屬性。
如果調(diào)用的屬性沒有,會(huì)拋出 AttributeError 異常。如果屬性查找(attribute lookup)在實(shí)例以及對(duì)應(yīng)的類中(通過__dict__)失敗, 那么會(huì)調(diào)用到類的__getattr__方法。

__getattribute__方法

A類在調(diào)用自身屬性的時(shí)候,是不會(huì)觸發(fā)__getattribute__()方法。
只有在調(diào)用A()實(shí)例屬性或方法的時(shí)候,才會(huì)觸發(fā)__getattribute__()方法

# 作者-上海悠悠 QQ交流群:717225969
# blog地址 https://www.cnblogs.com/yoyoketang/

class A(object):

count = 0

def __init__(self):
self.name = "yoyo"
self.age = 18

def start(self):
print("start1111111")

def __getattribute__(self, item):
"""屬性攔截器"""
print("調(diào)用了A類的屬性:", item)
return object.__getattribute__(self, item)

a = A()
# A()實(shí)例對(duì)象屬性會(huì)調(diào)用__getattribute__
print(a.count)
print(a.age)
print(a.name)
print(a.start())

如果A類屬性(__dict__)沒查找到,并且實(shí)例屬性和方法也沒找到,此時(shí)會(huì)拋出 AttributeError 異常

a = A()
print(a.weight) # 找不到屬性

運(yùn)行結(jié)果

調(diào)用了A類的屬性: weight
Traceback (most recent call last):
File "demo/aaa.py", line 27, in <module>
print(a.weight) # 找不到屬性
File "demo/aaa.py", line 18, in __getattribute__
return object.__getattribute__(self, item)
AttributeError: 'A' object has no attribute 'weight'

__getattr__方法

如果屬性查找(attribute lookup)在實(shí)例以及對(duì)應(yīng)的類中(通過__dict__)失敗, 那么會(huì)調(diào)用到類的__getattr__方法。

# 作者-上海悠悠 QQ交流群:717225969
# blog地址 https://www.cnblogs.com/yoyoketang/

class A(object):

count = 0

def __init__(self):
self.name = "yoyo"
self.age = 18

def start(self):
print("start1111111")

def __getattribute__(self, item):
"""屬性攔截器"""
print("調(diào)用了A類的屬性:", item)
return object.__getattribute__(self, item)

def __getattr__(self, item):
"""屬性找不到會(huì)執(zhí)行這個(gè)方法"""
print("找不到該屬性:%s" % item)
return 'not found'

a = A()
# A()實(shí)例對(duì)象屬性會(huì)調(diào)用__getattribute__
print(a.count)
print(a.age)
print(a.weight)

運(yùn)行結(jié)果不會(huì)出現(xiàn)異常

調(diào)用了A類的屬性: count
0
調(diào)用了A類的屬性: age
18
調(diào)用了A類的屬性: weight
找不到該屬性:weight
not found

使用場景

網(wǎng)上有個(gè)很經(jīng)典的使用示例,訪問字典的key,像訪問屬性一樣訪問字典。
字典取值有2種方式,通過dict[key] 和dict.get(key)的方式取值。

a = {
"name": "yoyo",
"age": 18
}

# 字典訪問
print(a["name"])
print(a.get("name"))

在其它語言里面,比如javascript里面可以把json當(dāng)一個(gè)object對(duì)象,通過a.name,a.age這種點(diǎn)的方式就能直接取值了。
于是我們自己寫一個(gè)類來實(shí)現(xiàn)這種方式

class ObjectDict(dict):
def __init__(self, *args, **kwargs):
super(ObjectDict, self).__init__(*args, **kwargs)

def __getattr__(self, name):
value = self[name]
if isinstance(value, dict):
value = ObjectDict(value)
return value

if __name__ == '__main__':
a = {
"name": "yoyo",
"age": 18
}
obj = ObjectDict(a)
print(obj.name)
print(obj.age)

也可以傳多個(gè)值

if __name__ == '__main__':
obj = ObjectDict(a={'age': 1, 'name': 'yoyo'}, d=True)
print(obj.a)
print(obj.a.name)
print(obj.d)

dict嵌套dict也可以通過.的方式取值

if __name__ == '__main__':
obj = ObjectDict(a={'age': 1,
'name': 'yoyo',
'data': {'id': 11, 'tel': 12345678900}}, d=True)
print(obj.a)
print(obj.a.name)
print(obj.a.data)
print(obj.a.data.id)
print(obj.a.data.tel)

運(yùn)行結(jié)果

{'age': 1, 'name': 'yoyo', 'data': {'id': 11, 'tel': 12345678900}}
yoyo
{'id': 11, 'tel': 12345678900}
11
12345678900

參考資料https://www.cnblogs.com/xybaby/p/6280313.html

本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
Python黑魔法之描述符
python attribute lookup
解密 __getattr__ 和 __getattribute__ 的用法與區(qū)別
技術(shù)圖文:Python魔法方法之屬性訪問詳解
Python學(xué)習(xí)——面向?qū)ο蟾呒?jí)之反射
day22總結(jié)
更多類似文章 >>
生活服務(wù)
熱點(diǎn)新聞
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服