Python对象代理:如何访问代理

Python对象代理:如何访问代理,python,proxy-classes,Python,Proxy Classes,我找到了创建代理类的方法。我用它包装了一个自定义对象,希望重载某些属性,并将新属性附加到代理。然而,当我调用代理上的任何方法(从代理类中)时,我最终被委托给wrappee,这不是我想要的 有没有办法访问或存储对代理的引用 下面是一些代码(未测试)来演示这个问题 class MyObject(object): @property def value(self): return 42 class MyObjectProxy(Proxy): # see the link above

我找到了创建代理类的方法。我用它包装了一个自定义对象,希望重载某些属性,并将新属性附加到代理。然而,当我调用代理上的任何方法(从代理类中)时,我最终被委托给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
从某种意义上说,我的问题是代理工作得太好了,隐藏了它自己的所有方法/属性,并将自己伪装成代理对象(这是它应该做的)

更新

根据下面的评论,我将
\uuuu getattribute\uuu
更改为:

def __getattribute__(self, attr):
    try:
        return object.__getattribute__(self, attr)
    except AttributeError:
        return super(MyObjectProxy, self).__getattribute__(attr)

现在看来这是个好办法,但最好直接将其添加到
代理
类。

代码出错的原因是
\uuuu getattribute\uuu
中的循环。您希望覆盖
\uuuu getattribute\uuuu
,以便可以访问代理类本身中的某些属性。但让我们看看

调用
p.value
时,将调用
\uuuu getattribute\uuuu
。如果attr='value',则返回self.other_value()。这里我们需要调用另一个\u值,所以我们再次输入
\uuuuuuGetAttribute\uuuuuuuuu

这一次我们来到这里
返回super(MyObjectProxy,self)。\uuu getattribute\uuu(attr)
。我们调用
代理
\uuuu getattribute\uuuu
,它尝试在
Myobject
中获取
另一个值
。因此出现了例外情况

您可以从回溯中看到,我们最终转到
返回super(MyObjectProxy,self)。\uu getattribute(attr)
,但不应转到

Traceback (most recent call last):
  File "proxytest.py", line 22, in <module>
    print p.value
  File "proxytest.py", line 13, in __getattribute__
    if attr == 'value':  return self.another_value() # return method or attribute, doesn't matter (same effect)
  File "proxytest.py", line 14, in __getattribute__
    return super(MyObjectProxy, self).__getattribute__(attr)
  File "/home/hugh/m/tspace/proxy.py", line 10, in __getattribute__
    return getattr(object.__getattribute__(self, "_obj"), name)
AttributeError: 'MyObject' object has no attribute 'another_value'
回溯(最近一次呼叫最后一次):
文件“proxytest.py”,第22行,在
打印p.value
文件“proxytest.py”,第13行,在__
如果attr=='value':返回self。另一个_值()#返回方法或属性不重要(效果相同)
文件“proxytest.py”,第14行,在__
返回super(MyObjectProxy,self)。\uuuu getattribute\uuuuu(attr)
文件“/home/hugh/m/tspace/proxy.py”,第10行,在__
返回getattr(object.\uuu getattribute\uuuu(self,“\u obj”),name)
AttributeError:“MyObject”对象没有“其他值”属性
编辑:

将代码行
如果attr=='value':返回self.other_value()
更改为
如果attr=='value':返回对象。uuu getattribute_uuu(self,'other_value')()

感谢您复制并确认上述内容,@zhangyangyu。关于如何获得想要的行为有什么建议吗?我想我以前试过,但我一定是弄错了。您的解决方案运行良好。在访问代理类之前,我将先修复
代理
类以查找它自己的属性。直接修复
代理
类似乎比我想象的问题更大。我试图在
中调用
hasattr(self,attr)
,但这似乎以无限循环结束(是否
hasattr
真的在调用
\uu getattribute
?)是的。阅读。@orangeNasty!我用你的答案更新了我的问题,并在你链接的帖子上找到了我的答案。