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)使用上面的代码,我想实现以下行为:
>>>t = Test()
>>>t.a
1
>>>t._shadow.a = 17
>>>t.a
17
>>>t.b
2代码可以工作,但它将打印“非阴影”M次(直到达到递归深度)。问题是,为什么不应该涉及任何递归,我调用的是object.__getattribute__而不是self.__getattribute__。
发布于 2014-04-10 11:20:55
__getattribute__被调用为all属性访问,包括self._shadow。但是,由于您已经重写了__getattribute__,self._shadow将触发无限递归。
唯一的解决办法是使用object.__getattribute__或更好的super(Test, self).__getattribute__检索_shadow属性:
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异常。
演示:
>>> t = Test()
>>> t.a
not shadowed
1
>>> t._shadow.a = 42
not shadowed
>>> t.a
42请注意,在这里,访问t._shadow也会在'not shadowed'消息通过__getattribute__处理程序时触发它。
https://stackoverflow.com/questions/22986546
复制相似问题