我有一個類LabelMapper
(一個boost::python
類),它實現字典協議。我想有一個代理類,它將使用屬性來訪問該dicionary。我已經看到很多帖子,覆蓋__setitem__
和__getitem__
,但我似乎無法做到正確。代理類訪問其他類的項目作爲屬性(__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']
什麼是解決方案?也許有在標準庫中預煮的代理嗎?
只是我的2c:我會將'mapper'重命名爲'__mapper',這樣如果有人想使用'mapper'作爲屬性名稱,它將保持一致。 – bereal
@ bereal:當然,但這並不能解決這裏的問題。 :-) –
太棒了!在'__getattr__'中查找'self.mapper'時,如何讓'__getattr__'不進入循環?那是'__getattribute__'和'__getattr__'的區別嗎? – eudoxos