为什么在访问 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__
中) .
在具有某种程度 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__
中) .