首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >何时使用__getattr__

何时使用__getattr__
EN

Stack Overflow用户
提问于 2012-05-26 05:50:39
回答 4查看 2K关注 0票数 3

我偶然发现了内置的__getattr__,我想知道什么时候会用到它。我费了好大劲才从文档中想出一个实际用途。

http://docs.python.org/reference/datamodel.html#。如何在代码中使用和使用它的实际示例是什么?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-05-26 06:09:08

一个例子是在字典中使用对象表示法。例如,考虑一本字典

代码语言:javascript
复制
myDict = {'value': 1}

通常在Python中,访问“value”变量的方式为

代码语言:javascript
复制
myDict['value']

它将在Python解释器上打印1。但是,您可能希望使用myDict.value表示法。这可以通过使用以下类来实现:

代码语言:javascript
复制
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
票数 9
EN

Stack Overflow用户

发布于 2012-05-26 05:53:26

一个示例用法是在某个对象周围创建一个简单的包装器。例如,为了记录调用或修改它的行为,而不继承它,也不需要实现对象的整个接口。

有几个很好的有文档记录的例子,比如http://western-skies.blogspot.fr/2008/02/complete-example-of-getattr-in-python.html

票数 3
EN

Stack Overflow用户

发布于 2012-05-26 06:10:53

因为__getattr__only called when an attribute is not found,所以它可以作为一种有用的方法来定义查找属性的替代位置,或者提供与defaultdict类似的默认值。

您还可以通过将此处的所有查找委托给另一个对象来模拟比对象MRO中的所有其他基类更高的基类(尽管这样做可能会导致无限循环,如果另一个对象正在委托回该属性)。

还有__getattribute__,它是相关的,因为每当在对象上查找任何属性时都会调用它。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10761779

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档