Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Python 2.5中创建外观_Python - Fatal编程技术网

在Python 2.5中创建外观

在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'时

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