gpt4 book ai didi

Python 对象代理 : how to access proxy

转载 作者:行者123 更新时间:2023-11-28 18:47:45 24 4
gpt4 key购买 nike

我找到了 this创建代理类的方法。我用它来包装自定义对象,并希望重载某些属性并将新属性附加到代理。但是,当我调用代理上的任何方法(从代理类中)时,我最终被委托(delegate)给包装器,这不是我想要的。

是否有任何方法可以访问或存储对代理的引用?

这里有一些代码(未经测试)来演示这个问题。

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

从某种意义上说,我的问题是代理工作得太好了,隐藏了它自己的所有方法/属性并将自己伪装成代理对象(这是它应该做的)......

更新

根据下面的评论,我将 __getattribute__ 更改为:

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

目前这似乎可以解决问题,但最好将其直接添加到 Proxy 类中。

最佳答案

您的代码出错的原因是__getattribute__ 中的循环。您想要覆盖 __getattribute__ 以便您可以访问代理类本身中的某些属性。但是让我们看看。

当您调用 p.value 时,将调用 __getattribute__。然后它来到这里 if attr == 'value': return self.another_value()。这里我们需要调用another_value 所以我们再次输入__getattribute__

这次我们来了return super(MyObjectProxy, self).__getattribute__(attr)。我们调用 Proxy__getattribute__,它会尝试获取 Myobject 中的 another_value。所以会出现异常。

你可以从回溯中看到我们最终去了 return super(MyObjectProxy, self).__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'

编辑:
将代码行 if attr == 'value': return self.another_value() 更改为 if attr == 'value': return object.__getattribute__(self, 'another_value')( )

关于Python 对象代理 : how to access proxy,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17584168/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com