首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >理解__getattribute__

理解__getattribute__
EN

Stack Overflow用户
提问于 2014-04-10 11:19:07
回答 1查看 374关注 0票数 1
代码语言:javascript
运行
复制
class Shadow(object):
    pass

class Test(object):
    a = 1
    b = 2

    _shadow = Shadow()

    def __getattribute__(self, name):
        try:
            return object.__getattribute__(self._shadow, name)
        except: print "not shadowed"
        return object.__getattribute__(self, name)

使用上面的代码,我想实现以下行为:

代码语言:javascript
运行
复制
>>>t = Test()
>>>t.a
1
>>>t._shadow.a = 17
>>>t.a
17
>>>t.b
2

代码可以工作,但它将打印“非阴影”M次(直到达到递归深度)。问题是,为什么不应该涉及任何递归,我调用的是object.__getattribute__而不是self.__getattribute__

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-04-10 11:20:55

__getattribute__被调用为all属性访问,包括self._shadow。但是,由于您已经重写了__getattribute__self._shadow将触发无限递归。

唯一的解决办法是使用object.__getattribute__或更好的super(Test, self).__getattribute__检索_shadow属性:

代码语言:javascript
运行
复制
class Test(object):
    a = 1
    b = 2

    _shadow = Shadow()

    def __getattribute__(self, name):
        shadow = super(Test, self).__getattribute__('_shadow')
        try:
            return getattr(shadow, name)
        except AttributeError:
            print "not shadowed"
        return super(Test, self).__getattribute__(name)

对于影子对象的属性访问,不需要使用object.__getattribute__。不要使用口袋妖怪式的异常处理(您不想全部捕获它们);这里只捕获特定的AttributeError异常。

演示:

代码语言:javascript
运行
复制
>>> t = Test()
>>> t.a
not shadowed
1
>>> t._shadow.a = 42
not shadowed
>>> t.a
42

请注意,在这里,访问t._shadow也会在'not shadowed'消息通过__getattribute__处理程序时触发它。

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

https://stackoverflow.com/questions/22986546

复制
相关文章

相似问题

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