__getattr__和__getattribute__ 區(qū)別

對(duì)于這兩個(gè)魔法方法的區(qū)別,只需要知道,getattr方法是在查找不到這個(gè)類的屬性拋異常了才會(huì)調(diào)用,而getattribute則是無(wú)論訪問(wèn)什么屬性都會(huì)調(diào)用.從而我們就需要根據(jù)自己的需求來(lái)重寫它們的邏輯.
舉個(gè)例:

class Student:
    def __init__(self, name,age):
        self.name = name
        self.age = age
    def __getattr__(self, item):
        returnn 'not find the attr'
if __name__ == '__main__':
    st = Student('小明', 10)
    print(st.Name)   # 打印出  'not find the attr'

根據(jù)打印知道如果訪問(wèn)這個(gè)對(duì)象沒(méi)有的屬性就會(huì)調(diào)用getattr這個(gè)方法,從而可以重寫這個(gè)方方法實(shí)現(xiàn)一些我們想要的邏輯,比如:

class Student:
    def __init__(self, name,age, info):
        self.name = name
        self.age = age
        self.info = info
    def __getattr__(self, item):
        return self.info[item]
if __name__ == '__main__':
    st = Student('小明', 10, info={'number': '5120152566', 'broth': '2016-9-6'})
    print(st.number)   # 打印出 '5120152566'

在查找這個(gè)對(duì)象的number屬性時(shí),發(fā)現(xiàn)沒(méi)有,就會(huì)調(diào)用重寫后的getattr方法去對(duì)象的info屬性里面再查找這個(gè)屬性并返回.

class Student:
    def __init__(self, name, age, info):
        self.name = name
        self.age = age
        self.info = info

    # def __getattr__(self, item):
    #     return self.info[item]

    def __getattribute__(self, item):
        return '屬性呀'

if __name__ == '__main__':
    st = Student('小明', 10, info={'number': '5120152566', 'broth': '2016-9-6'})
    print(st.name)  # 打印出 '屬性呀'
    print(st.number)   #打印出 '屬性呀'

無(wú)論訪問(wèn)什么屬性都會(huì)調(diào)用getattribute方法,一般情況下不會(huì)重寫這個(gè)方法容易出錯(cuò)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容