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

时间:2015-01-07 12:44:23

标签: python introspection

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

getattr(some_object, attribute_name_string)

这种模式首选的原因是:

some_object.__dict__[attribute_name_string]

似乎更直接地显示了正在发生的事情?是因为后者太接近CPython中可能会发生变化的特定实现吗?

NB 原始问题错误地将流行的习语标识为:

some_object.__getattr__(attribute_name_string)

1 个答案:

答案 0 :(得分:11)

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

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

可能有直接访问__getattr__挂钩或__dict__属性的用途,但这些只是专门用途。 __getattr__仅在首次在其他位置找不到该属性时使用(例如,对于类 > <{1}}中的属性

}。