久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

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

 上海悠悠 2021-08-20

前言

object 類里面有個(gè) __getattribute__ 方法,作用是類實(shí)例化調(diào)用屬性和方法的時(shí)候都會(huì)調(diào)用一次,,返回該類的屬性。
如果調(diào)用的屬性沒有,,會(huì)拋出 AttributeError 異常,。如果屬性查找(attribute lookup)在實(shí)例以及對應(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í)例對象屬性會(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í)例以及對應(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í)例對象屬性會(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對象,,通過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

    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多