#__getarr__,__getattribute__
#__getattr__就是在查找不到属性的时候调用
from datetime import date
class User:
def ___init__(self,name,brithday,info={}):
self.name=name
self.brithday=brithday
self.info=info
def __getattr__(self, item):
return self.info[item]
if __name__ == '__main__':
user=User("boddy",date(year=1987,month=11,day=1),info={"company_name":"imooc"})
print(user.company_name)
__getattribute__尽量不使用 ,在设计类时候可以实例化对象时候使用。访问属性的方法,我们可以通过方法重写来扩展方法的功能。
调用方法其实是类里面的一个同名属性指向了一个函数(方法),返回的是函数的引用,再用 函数() 这种方式就可以调用它
在调用实例的方法的时候,实际上给对象传过去的只是一个字符串而已。
无论调用属性还是方法,都是先强制调用 __getattribute__ 方法,然后再传回属性的值或者是 函数(方法)的引用.
注意,在 __getattribute__ 方法里面 如果再用类似 self.*** 这种调用方式 ,那么是一件很不好的行为,因为 每次调用类的属性都会强制调用 __getattribute__ ,所以极有可能造成递归调用。
_getattribute__ 方法功能:
1 调用属性会触发该功能,属性存在则会返回相应的值;
2 如果属性不存在则会抛出异常AttributeError,所以可以自定义异常信息
3 存在__getattr__,若有异常出现则会传递给__getattr__用来接收,执行操作
1.__getattribute__方法优先级比__getattr__高
2.只有在__getattribute__方法中找不到对应的属性时,才会调用__getattr__
3.如果是对不存在的属性做处理,尽量把逻辑写在__getattr__方法中
4.如果非得重写__getattribute__方法,需要注意两点:第一是避免.操作带来的死循环;第二是不要遗忘父类的__getattribute__方法在子类中起的作用