【发布时间】:2013-07-11 02:40:00
【问题描述】:
我找到了this 创建代理类的方法。我用它来包装一个自定义对象,并希望重载某些属性并将新属性附加到代理。但是,当我调用代理上的任何方法时(从代理类中),我最终被委派给了我不想要的 wrappee。
有没有办法访问或存储对代理的引用?
这里有一些代码(未经测试)来演示这个问题。
class MyObject(object):
@property
def value(self):
return 42
class MyObjectProxy(Proxy): # see the link above
def __getattribute__(self, attr):
# the problem is that `self` refers to the proxied
# object and thus this throws an AttributeError. How
# can I reference MyObjectProxy.another_value()?
if attr == 'value': return self.another_value() # return method or attribute, doesn't matter (same effect)
return super(MyObjectProxy, self).__getattribute__(attr)
def another_value(self):
return 21
o = MyObject()
p = MyObjectProxy(o)
print o.value
print p.value
从某种意义上说,我的问题是代理工作得太好了,隐藏了它自己的所有方法/属性并将自己伪装成代理对象(这是它应该做的)......
更新
根据下面的cmets,我把__getattribute__改成了这个:
def __getattribute__(self, attr):
try:
return object.__getattribute__(self, attr)
except AttributeError:
return super(MyObjectProxy, self).__getattribute__(attr)
现在这似乎可以解决问题,但最好将其直接添加到 Proxy 类中。
【问题讨论】:
标签: python proxy-classes