我想要一个 Python 类作为另一个 Python 类的包装器。
像这样
class xxx:
name = property( fset=lambda self, v: setattr(self.inner, 'name', v), fget=lambda self: getattr(self.inner, 'name' ))
def setWrapper( self, obj )
self.inner = obj
所以当有人说 xxx().x = 'hello' 时,我希望它在 xxx().inner.whatever 上设置值而不是 xxx().x。
这可能吗?我一直在尝试 lambda,但无济于事。我正在使用 Python 2.5
编辑: 现在我的妻子不催我 sleep 了,这样我就可以再整理一下代码了。我有点了解你们下面的内容,但是来自 docs似乎您应该避免覆盖 __setattr__/__getattr__ 并改用属性。如果无法通过属性函数执行此操作,那么我将使用 __setattr__/__getattr__?谢谢
请您参考如下方法:
这是您使用 __setattr__ 和 __getattr__ 方法的地方,如记录 here .
简而言之,如果你这样做:
class Wrapper(object):
def __init__(self, wrapped):
object.__setattr__(self, 'inner', wrapped)
def __getattr__(self, attr):
return getattr(self.inner, attr)
def __setattr__(self, attr, value):
setattr(self.inner, attr, value)
它应该可以满足您的需求。我强烈建议阅读上面链接的文档。
编辑:如前所述,原始版本由于 __setattr__ 被无条件调用而失败。我已经更新了这个例子。请注意,此版本依赖于新式类行为(如从对象子类化所示)。对于旧式,我认为你需要像下面这样乱用 __dict__:
class OldStyleWrapper:
def __init__(self, wrapped):
self.__dict__['inner'] = wrapped
def __getattr__(self, attr):
return getattr(self.inner, attr)
def __setattr__(self, attr, value):
setattr(self.inner, attr, value)
