Skip to main content
 首页 » 编程设计

python之在 Python 2.5 中创建外观

2025年05月04日9落叶无声

我想要一个 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)