在具有某种程度的Python对象内省的源示例和SO答案中,常见的模式是:
getattr(some_object, attribute_name_string)
这种模式首选的原因是:
some_object.__dict__[attribute_name_string]
似乎更直接地显示了正在发生的事情?是因为后者太接近CPython中可能会发生变化的特定实现吗?
NB 原始问题错误地将流行的习语标识为:
some_object.__getattr__(attribute_name_string)
答案 0 :(得分:11)
some_object.__getattr__
不是一种常见模式。 getattr(some_object, attribute_name_string)
是动态访问属性的正确方法。
并非所有实例都具有 __dict__
属性;例如,使用__slots__
的类不具备该属性。接下来,不必在实例上找到属性,而是属性类属性。 getattr()
会找到那些,__dict__
看不到它们。类的属性也可能取决于descriptor protocol。
可能有直接访问__getattr__
挂钩或__dict__
属性的用途,但这些只是专门用途。 __getattr__
仅在首次在其他位置找不到该属性时使用(例如,对于类 > <{1}}中的属性