假设我有一个名为X的类。X的目的是封装一个list
或dict
并提供事件监听能力。一切运行良好。
class X(object):
def __init__(self, obj)
self._obj = obj
def __getattr__(self, name):
# do stuff with self._obj
def __getitem__(self, key):
return self._obj[key]
def __setitem__(self, key, val):
self._obj[key] = val
# rest of functionality ...
因此,您可以像这样使用它来包装一个dict
:
x = X({
'foo' : False
})
x.listen('foo', callback)
X['foo'] = True # triggers event
X.update({
'foo' : False # triggers event
})
或者一个
列表
:x = X([1,2])
x.listen(callback)
X.append(1) # triggers event
X[0] = 10 # triggers event
很好,接近我想要实现的目标了...
现在的问题是,因为X
既适用于list
对象又适用于dict
对象,所以它不能从任何一个对象继承。这意味着我没有魔术类函数,例如__contains__
。
这导致了以下代码:
d = X({
'foo' : True
})
if 'foo' in d:
print 'yahoo!'
抛出 KeyError
错误。
我如何解决这个问题,而不需要在 X
中定义每个魔法方法。如果我采用这种方式,对于每个定义,我都必须写两个返回值,基于 self._obj
是否是一个 list
或者 dict
。
起初,我以为可以使用元类来解决这个问题,但似乎并不是最好的解决方案,因为我需要访问传递的值来检查它是否是 dict
或者 list
。
DictWrapper
包括对__contains__
的测试。 - jq170727self
而不是(所需的)self._obj
。 - Davis Herring