作者:手机用户2502854043 | 来源:互联网 | 2023-05-28 00:05
在源示例和具有某种程度的Python对象内省的SO答案中,常见的模式是:
getattr(some_object, attribute_name_string)
是否有理由将此模式作为首选:
some_object.__dict__[attribute_name_string]
这似乎更直接地显示了正在发生的事情?是因为后者太接近CPython中可能会发生变化的特定实现吗?
NB原始问题错误地将流行的成语识别为:
some_object.__getattr__(attribute_name_string)
Martijn Piet..
11
some_object.__getattr__
是不常见的图案.getattr(some_object, attribute_name_string)
是动态访问属性的正确方法.
并非所有实例都具有__dict__
属性; __slots__
例如,使用的类将不具有该属性.接下来,不一定在实例上找到属性,而是属性类属性.getattr()
会找到那些,看着__dict__
就找不到它们.类上的属性也可能取决于描述符协议.
可能有直接访问__getattr__
钩子或__dict__
属性的用途,但这些仅用于专门用途.__getattr__
仅在首次在其他位置找不到属性时才使用(例如,对于类或其中没有的属性instance.__dict__
).
1> Martijn Piet..:
some_object.__getattr__
是不常见的图案.getattr(some_object, attribute_name_string)
是动态访问属性的正确方法.
并非所有实例都具有__dict__
属性; __slots__
例如,使用的类将不具有该属性.接下来,不一定在实例上找到属性,而是属性类属性.getattr()
会找到那些,看着__dict__
就找不到它们.类上的属性也可能取决于描述符协议.
可能有直接访问__getattr__
钩子或__dict__
属性的用途,但这些仅用于专门用途.__getattr__
仅在首次在其他位置找不到属性时才使用(例如,对于类或其中没有的属性instance.__dict__
).