我有一个类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']
解决办法是什么?也许标准库中有这样的代理?