2009-09-24 70 views
1

我想要一个Python类,充当另一个Python类的包装。在Python中创建一个门面2.5

像这样的事情

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 = '你好',我希望它设置XXX()的值。inner.whatever,而不是演XXX()X。

这可能吗?我一直在尝试lambda,但无济于事。我正在使用Python 2.5

编辑: 现在我的妻子并没有让我睡觉,所以我可以更多地清理代码。我有点想到你们下面有什么,但从docs看来,你应该避免重写__setattr__/__getattr__并使用属性。如果通过属性功能无法做到这一点,那么我将使用__setattr__/__getattr__?谢谢

回答

6

这是您使用__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) 
5

作为另一个答案说,__getattr____setattr__是关键,你使用后者时需要人照顾...:

class Wrapper(object): 
    def __init__(self, wrapped): 
     object.__setattr__(self, 'inner', wrapped) 

    def __getattr__(self, n): 
     return getattr(self.inner, n) 

    def __setattr__(self, n, value): 
     setattr(self.inner, n, value) 

你不需要为self.inner访问预防措施,因为__getattr__被调用仅适用于不以其他方式存在的属性;但__setattr__会从object呼吁每个属性,所以当你真正需要设置self.inner(或任何其他属性),你需要__setattr__(这里我使用object为宗旨,以明确绕过,所以我也继承 - 高度无论如何,在Python 2. *中,否则你会做一个“旧式类”[[AT LAST在Python 3中消失的类]],你真的不想这样做。 .. ;-)。

+0

好一点,我已经编辑我的例子,以配合你的。 =) – Benno 2009-09-24 03:31:37

0

相信无论是亚历克斯和Ben的回答如下应该修改自己的电话的setattr:

setattr(self.inner, n, value)