在Python 2.5中创建外观
我想要一个Python类,它充当另一个Python类的包装器 像这样的在Python 2.5中创建外观,python,Python,我想要一个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'时
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().internal.whatever的值,而不是xxx().x
这可能吗?我一直在试lambdas,但没用。我正在使用Python 2.5
编辑:
现在我妻子不再催我上床睡觉了,这样我就可以把代码再整理一下了。我对下面的内容有点了解,但从下面的示例来看,似乎应该避免重写
\uuuuuuuuu setattr\uuuuu/\uuuuuuu getattr\uuuuu
,而是使用属性。如果无法通过属性函数执行此操作,则我将使用\uuuuuuu setattr\uuuuu/\uuuuuuuu getattr\uuuuu
?谢谢这是您使用\uuuu setattr\uuuu
和\uuuu getattr\uuuuuu
方法的地方,如文档所示
简而言之,如果您这样做:
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)
它应该满足你的要求。我强烈建议您阅读以上链接的文档
编辑:如前所述,原始版本由于无条件调用\uuuu setattr\uuuu
而失败。我已经更新了这个例子。请注意,此版本依赖于新样式的类行为(如从对象子类化所示)。对于旧式风格,我认为您需要处理\uuuu dict\uuuu
,如下所示:
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)
setattr(self.inner, n, value)
在这里,您可以使用所记录的
\uuuuuu setattr\uuuuuu
和\uuuuuuu getattr\uuuuuu
方法
简而言之,如果您这样做:
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)
它应该满足你的要求。我强烈建议您阅读以上链接的文档
编辑:如前所述,原始版本由于无条件调用\uuuu setattr\uuuu
而失败。我已经更新了这个例子。请注意,此版本依赖于新样式的类行为(如从对象子类化所示)。对于旧式风格,我认为您需要处理\uuuu dict\uuuu
,如下所示:
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)
setattr(self.inner, n, value)
正如另一个答案所说,
\uuuu getattr\uuuuu
和\uuuu setattr\uuuuu
是关键,但使用后者时需要小心
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.internal而采取预防措施,因为
\uuu getattr\uuuu
只会为不存在的属性调用;但是每个属性都会调用\uuuuu setattr\uuuuu
,因此当您实际需要设置self.internal(或任何其他属性)时,您需要显式绕过\uuuuu setattr\uuuuuu
(这里我使用的是对象
,因此我也继承了对象
——高度无论如何,在Python 2中都是可取的。*,否则您将创建一个“旧式类”[[在Python 3中最后消失的那种]],您真的不想……;-).正如另一个答案所说,\uuu getattr\uuuuuuuuu
和\uuuuuu setattr\uuuuuuuu
是关键,但使用后者时需要小心……:
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而采取预防措施,因为
\uuuu getattr\uuuuu
只会为不存在的属性调用;\uu setattr\uuuuu
会为每个属性调用,因此当您实际需要设置self.inner(或任何其他属性)时,您需要显式地绕过\uuuu setattr\uuuuu
(这里我使用的是对象
,因此我也继承了对象
--高度无论如何,在Python 2中都是可取的。*,否则您将创建一个“旧式类”[[在Python 3中最后消失的那种]],您真的不想…;-).我认为Alex和Ben的答案都应该编辑他们的setattr调用,如下所示:
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)
setattr(self.inner, n, value)
我认为Alex和Ben的答案都应该编辑他们的setattr调用,如下所示:
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)
setattr(self.inner, n, value)