__getattr__
__getattr__方法的自动执行,需要满足两个条件:一是通过实例访问属性;二是触发了AttributeError异常(属性不存在)。
上图中,调用不存在的job属性,会首先调用__getattribute__方法,触发AttributeError异常并自动捕获,然后才调用__getattr__方法。
__getattribute__
该方法可以拦截对对象属性的所有访问企图,当属性被访问时,自动调用该方法(只适用于新式类)。
通过上图中的代码示例可以看出,一旦实现了__getattribute__方法,所有通过对象访问的属性(包括类属性)都会被拦截,而直接通过类访问类属性则不会。
调用父类的方法super().__getattribute__(item),实现:
1)通过对象访问属性时,可以正常返回值;
2)当调用的属性不存在时,会抛出异常AttributeError,并调用__getattr__方法;