日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

__getattr__动态获取接口

發(fā)布時間:2025/3/15 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 __getattr__动态获取接口 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
# -*- coding:utf-8 -*- #在看廖雪峰的python3.5教學(xué)時,看到面向?qū)ο蟾呒壘幊蘝定義類 https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/0014319098638265527beb24f7840aa97de564ccc7f20f6000 百度了很久沒有找到想要的答案,想了很久,總結(jié)了一點點心得,寫的不好,希望大家指正 途中發(fā)現(xiàn)好多問題,包括前面沒有理解的,停留了好久 ################################## #正常情況下,當(dāng)我們調(diào)用類的方法或?qū)傩詴r,如果不存在,就會報錯。比如定義Student類:class Student(object):def __init__(self):self.name = 'Michael'#調(diào)用name屬性,沒問題,但是,調(diào)用不存在的score屬性,就有問題了: #>>> s = Student() #>>> print(s.name) #Michael #>>> print(s.score) #Traceback (most recent call last): # ... #AttributeError: 'Student' object has no attribute 'score'#錯誤信息很清楚地告訴我們,沒有找到score這個attribute。 #要避免這個錯誤,除了可以加上一個score屬性外,Python還有另一個機(jī)制,那就是寫一個__getattr__()方法,動態(tài)返回一個屬性。修改如下:class Student(object):def __init__(self):self.name = 'Michael'def __getattr__(self, attr):if attr=='score':return 99#當(dāng)調(diào)用不存在的屬性時,比如score,Python解釋器會試圖調(diào)用__getattr__(self, 'score')來嘗試獲得屬性,這樣,我們就有機(jī)會返回score的值:#>>> s = Student() #>>> s.name #'Michael' #>>> s.score #99#返回函數(shù)也是完全可以的:class Student(object):def __getattr__(self, attr):if attr=='age':return lambda: 25#只是調(diào)用方式要變?yōu)?#xff1a; #>>> s.age() #25#注意,只有在沒有找到屬性的情況下,才調(diào)用__getattr__,已有的屬性,比如name,不會在__getattr__中查找。#此外,注意到任意調(diào)用如s.abc都會返回None,這是因為我們定義的__getattr__默認(rèn)返回就是None。要讓class只響應(yīng)特定的幾個屬性,我們就要按照約定,拋出AttributeError的錯誤:class Student(object):def __getattr__(self, attr):if attr=='age':return lambda: 25raise AttributeError('\'Student\' object has no attribute \'%s\'' % attr)#這實際上可以把一個類的所有屬性和方法調(diào)用全部動態(tài)化處理了,不需要任何特殊手段。#這種完全動態(tài)調(diào)用的特性有什么實際作用呢?作用就是,可以針對完全動態(tài)的情況作調(diào)用。#舉個例子:#現(xiàn)在很多網(wǎng)站都搞REST API,比如新浪微博、豆瓣啥的,調(diào)用API的URL類似:#http://api.server/user/friends #http://api.server/user/timeline/list #如果要寫SDK,給每個URL對應(yīng)的API都寫一個方法,那得累死,而且,API一旦改動,SDK也要改。#利用完全動態(tài)的__getattr__,我們可以寫出一個鏈?zhǔn)秸{(diào)用:class Chain(object):def __init__(self, path=''):self._path = pathdef __getattr__(self, path):return Chain('%s/%s' % (self._path, path))def __str__(self):return self._path__repr__ = __str__#測試結(jié)果 #>>> Chain().status.user.timeline.list #'/status/user/timeline/list'#========================================== #這里想了很久;查看一個類 #創(chuàng)建了一個空的類,再創(chuàng)建一個實例實例class Student(object):pass#bart = Student() #變量bart指向的就是一個Student的實例#再看剛剛那個例子,Chain()表示類自己(本身); #Chain().status表示的類Chain()的status屬性,此時函數(shù)就去尋找Chain的status屬性 #但發(fā)現(xiàn)沒有此屬性,這時特殊函數(shù)__getattr__起作用了,它幫我們創(chuàng)建屬性status屬性 #根據(jù)定義的方法將新的屬性前加一個'/'#初始化使用了默認(rèn)參數(shù)path為空 #def __init__(self, path=''):#連貫起來就是 #1.先定義類Chain()的一個屬性path,切默認(rèn)值為'',為空 #2.定義方法,特殊函數(shù)__getattr__遇到未定義的屬性默認(rèn)返回空,不報錯 #由于定義了方法,所以返回return Chain('%s/%s' % (self._path, path)) #即將未定義的額屬性以'/'為分隔符輸出 #3.方法def __str__(self):的作用是打印字符串#當(dāng)然還有細(xì)節(jié)沒有搞清楚 #1.class中的各方法參數(shù)是表示同一個值嗎? #即三個方法中的self._path相關(guān)么?

轉(zhuǎn)載于:https://www.cnblogs.com/irockcode/p/7828737.html

總結(jié)

以上是生活随笔為你收集整理的__getattr__动态获取接口的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。