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'

その最後の部分では、プロパティ「value」が代わりに属性になっているため、「3」ではなく「value: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かどうかをテストする必要があります( 。また、元の実装を呼び出して、などが引き続き機能することを確認する必要があります。foohasattr(self, 'foo')__setattr__self.foo = Foo()

于 2012-09-19T06:51:18.713 に答える