我偶然发现了内置的__getattr__,我想知道什么时候会用到它。我费了好大劲才从文档中想出一个实际用途。
http://docs.python.org/reference/datamodel.html#。如何在代码中使用和使用它的实际示例是什么?
发布于 2012-05-26 06:09:08
一个例子是在字典中使用对象表示法。例如,考虑一本字典
myDict = {'value': 1}通常在Python中,访问“value”变量的方式为
myDict['value']它将在Python解释器上打印1。但是,您可能希望使用myDict.value表示法。这可以通过使用以下类来实现:
class DictAsMember(dict):
def __getattr__(self, name):
value = self[name]
if isinstance(value, dict):
value = DictAsMember(value)
return value
my_dict = DictAsMember()
my_dict['property'] = {'sub_property': 1}
print(my_dict.property.sub_property) # 1 will be printed发布于 2012-05-26 05:53:26
一个示例用法是在某个对象周围创建一个简单的包装器。例如,为了记录调用或修改它的行为,而不继承它,也不需要实现对象的整个接口。
有几个很好的有文档记录的例子,比如http://western-skies.blogspot.fr/2008/02/complete-example-of-getattr-in-python.html。
发布于 2012-05-26 06:10:53
因为__getattr__是only called when an attribute is not found,所以它可以作为一种有用的方法来定义查找属性的替代位置,或者提供与defaultdict类似的默认值。
您还可以通过将此处的所有查找委托给另一个对象来模拟比对象MRO中的所有其他基类更高的基类(尽管这样做可能会导致无限循环,如果另一个对象正在委托回该属性)。
还有__getattribute__,它是相关的,因为每当在对象上查找任何属性时都会调用它。
https://stackoverflow.com/questions/10761779
复制相似问题