3

考虑以下python代码:

class Foo(object):

    def __init__(self, value):
        self._value = value

    @property
    def value(self):
        return "value: {v}".format(v=self._value)

    @value.setter
    def value(self, value):
        self._value = value

class Bar(object):

    def __init__(self):
        self.foo = Foo('foo')

    def __getattr__(self, attr, *args, **kwargs):
        """
        Intercepts attribute calls, and if we don't have it, look at the
        webelement to see if it has the attribute.
        """

        # Check first to see if it looks like a method, if not then just return
        # the attribute the way it is.
        # Note: this has only been tested with variables, and methods.
        if not hasattr(getattr(self.foo, attr), '__call__'):
            return getattr(self.foo, attr)

        def callable(*args, **kwargs):
            '''
            Returns the method from the webelement module if found
            '''
            return getattr(self.foo, attr)(*args, **kwargs)
        return callable

>>> b = Bar()
>>> b.foo
<__main__.Foo object at 0x819410>
>>> b.foo.value
'value: foo'
>>> b.foo.value = '2'
>>> b.foo.value
'value: 2'
>>> b.value
'value: 2'
>>> b.value = '3'
>>> b.value
'3'

最后一部分,我希望它是“值:3”而不是“3”,因为现在我的属性“值”现在是一个属性。

有可能吗,如果是这样,我会怎么做。

4

1 回答 1

3

__getattr__返回属性,而不是属性本身。当您访问getattr(self.foo, attr)它时,它相当于self.foo.value并返回它,并且当时调用该属性。

因此,您还需要实现一个__setattr__方法,以镜像__getattr__并将值设置传递给包含的foo对象。

在底层,Python 将属性实现为描述符;他们的__get__()方法被较低级别的__getattribute__方法调用,这导致他们返回他们的计算值。返回的永远不是属性对象本身。

这是一个例子__setattr__

def __setattr__(self, attr, value):
    if hasattr(self, 'foo') and hasattr(self.foo, attr):
        setattr(self.foo, attr, value)
        return
    super(Bar, self).__setattr__(attr, value)

注意:因为你的__init__设置self.foo,你需要测试foo你的类是否存在(hasattr(self, 'foo')。你还需要调用原始__setattr__实现以确保像这样的东西self.foo = Foo()仍然有效。

于 2012-09-19T06:51:18.713 回答