访问类属性的顺序:
getattribute 
-> 如果没有找到属性,则引发异常AttributeError 
-> AttributeError 异常会触发 getattr,如果没有实现getattr 则抛出异常代码示例
# -*- coding: utf-8 -*-
class Dog(object):
    def __getattribute__(self, item):
        print("getattribute: {}".format(item))
        return super(Dog, self).__getattribute__(item)
    def __getattr__(self, item):
        print("getattr: {}".format(item))
        return self.default
    def eat(self):
        print("eat")
    def default(self):
        print("default")
def main():
    demo = Dog()
    demo.eat()
    demo.sleep()  # AttributeError
if __name__ == '__main__':
    main()
"""
getattribute: eat
eat
getattribute: sleep
getattr: sleep
getattribute: default
default
"""1、Dog类实现了eat 方法, 调用的时候经过getattribute 能够获取eat 则直接返回
 2、Dog类没有实现sleep方法, 调用的时候 getattribute没有获取该方法,则进入getattr ,此方法中默认返回default方法
可以理解为 getattr 捕获了 getattribute 抛出的 AttributeError 异常,对其进行了异常处理
参考:
Python getattribute vs getattr 浅谈









