我有一个类LabelMapper
(一个boost::python
类),它实现字典协议。我想有一个代理类,它将使用属性来访问该目录。我看过很多关于重写__setitem__
和__getitem__
的帖子,但我似乎不能正确理解。在
由于self.mapper
调用了LabelMapperProxy.__getattr__
,这又需要self.mapper
等等,所以这种天真的方法(如下)导致了无限递归。在
class LabelMapper(object):
def __init__(self): self.map={}
def __getitem__(self,key): return self.map[key]
def __setitem__(self,key,val): self.map[key]=val
def __delitem__(self,key): del self.map[key]
class LabelMapperProxy(object):
def __init__(self,mapper): self.mapper=mapper
def __getattr__(self,key): return self.mapper[key]
def __setattr__(self,key,val): self.mapper[key]=val
def __delattr__(self,key): del self.mapper[key]
lm=LabelMapper()
lm['foo']=123
# construct the proxy
lmp=LabelMapperProxy(mapper=lm)
print lmp.foo # !!! recursion
lmp.bar=456
print lmp.bar,lm['bar']
解决办法是什么?也许在标准库中有这样的代理吗?在
这是个陷阱:
您正在尝试在您的
Proxy
实例上设置一个新属性:这将触发一个
__setattr__
,它试图访问不存在的self.mapper
属性,因此会查询__getattr__
(这是为所有丢失的属性调用的)。并且__getattr__
试图访问self.mapper
。。。。在解决方案是直接在
^{pr2}$self.__dict__
中设置mapper
:或者,只对
mapper
属性使用原始基类__setattr__
:相关问题 更多 >
编程相关推荐