1. __getattr__ 和 __getattribute__区别
__getattr__只在没有找到目标属性时调用。很适合作为属性缺失时的缺省回调函数。
__getattribute__在查看对象的实际属性之前调用,需要注意避免无限递归。
一个代码示例来展示两个方法的使用, 创建一个自定义字典, 可以使用 obj.attr 的语法来访问字典内的数据。 如 obj = {"a": "b"} , obj.a 返回 b。 增加一个size属性,返回字典数据个数。
In [1]: from collections import UserDict
...:
...: class DotDict(UserDict):
...: def __init__(self, *args, **kwargs):
...: super().__init__(*args, **kwargs)
...: self.size = len(self)
...:
...: def __getattribute__(self, name: str):
...: return super().__getattribute__(name.lower())
...:
...: def __getattr__(self, name):
...: return self[name]