對(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ò)