为什么在访问 Python 对象属性时使用 getattr() 而不是 __dict__?

Why use getattr() instead of __dict__ when accessing Python object attributes?

在具有某种程度 Python 对象内省的源示例和 SO 答案中,常见模式是:

getattr(some_object, attribute_name_string)

是否有理由首选此模式:

some_object.__dict__[attribute_name_string]

哪个好像更直接的说明了事情的经过?是不是因为后者太接近 CPython 中的特定实现,可能会发生变化?

NB 原题错误地将流行的成语识别为:

some_object.__getattr__(attribute_name_string)

some_object.__getattr__ 不是 常见模式。 getattr(some_object, attribute_name_string) 是动态访问属性的正确方法。

并非所有实例 都具有 __dict__ 属性;例如,使用 __slots__ 的 class 将没有该属性。接下来,不一定 在实例 上找到属性,而是 class 属性。 getattr() 会找到那些,看着 __dict__ 不会找到它们。 class 上的属性也可能取决于 descriptor protocol.

可能有直接访问 __getattr__ 挂钩或 __dict__ 属性的用途,但这些只是专门用途。 __getattr__ 仅在属性未在其他地方首次找到时使用,例如(因此对于属性 not 出现在 class 或 instance.__dict__ 中) .