python都是对象,那么为什么字典不可以用.获取
obj.attr 的默认执行链是:
① 实例__dict__ → ② 类及父类__dict__ → ③ 描述符 → ④ __getattr__兜底
这一步由解释器内部完成,并不直接调用 getattribute/setattr。
只有当 类或父类显式定义了 getattribute/setattr 时,才会被当作钩子触发
getattribute/setattr 的用途
它们是 “重载点号行为” 的钩子,用于完全接管或拦截属性访问。
字典没有实现这些钩子,也没有在 dict 里给键名建同名属性,所以点号自然找不到键。
dict 不是通过普通的实例属性机制来存储数据的。
dict 用 C 实现的“映射表”
键值对存放在 独立的哈希表结构 里,
而不是 Python 层面的 dict 字典。
因此没有必要再暴露一个实例属性字典。
节省内存
如果每个 dict 再自带一个 dict,
就多了一层冗余,白白浪费内存。
一句话:
dict 自身就是哈希表的“外壳”,键值对直接放在 C 层哈希表里,不需要再套一层 dict