对于这两个魔法方法的区别,只需要知道,getattr方法是在查找不到这个类的属性抛异常了才会调用,而getattribute则是无论访问什么属性都会调用.从而我们就需要根据自己的需求来重写它们的逻辑.
举个例:
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'
根据打印知道如果访问这个对象没有的属性就会调用getattr这个方法,从而可以重写这个方方法实现一些我们想要的逻辑,比如:
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'
在查找这个对象的number属性时,发现没有,就会调用重写后的getattr方法去对象的info属性里面再查找这个属性并返回.
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) #打印出 '属性呀'
无论访问什么属性都会调用getattribute方法,一般情况下不会重写这个方法容易出错
网友评论