访问类属性的顺序:
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 异常,对其进行了异常处理
参考: