2

私のコードには多くのクラスが実装されています。ここで、これらすべてのクラスに対して呼び出されるメソッドごとに、次の行を追加する必要があることに気付きました。

with service as object:

だから私は自動的に仕事をするためにプロキシパターンを使用しようとしています、これは私のサンプルコードです

class A(object):
    def __init__(self, name):
        self.name = name
    def hello(self):
        print 'hello %s!' % (self.name)
    def __enter__(self):
        print 'Enter the function'
        return self
    def __exit__(self, exc_type, exc_value, traceback):
        print 'Exit the function'
class Proxy(object):
    def __init__(self, object_a):
#        object.__setattr__(self, '_object_a', object_a)
        self._object_a = object_a

    def __getattribute__(self, name):
        service = object.__getattribute__(self, '_object_a')
        with service as service:
            result = getattr(service, name)
        return result    

if __name__=='__main__':
    a1 = A('A1')
    b = Proxy(a1)
    b.hello()
    a2 = A('A2')
    b = Proxy(a2)
    b.hello()

すべてがうまく機能し、出力が得られます。

Enter the function A1
Exit the function A1
hello A1!
Enter the function A2
Exit the function A2
hello A2!

しかし、これは私が必要とするものではありません.

with a1 as a1:
    a1.hello()

そして、出力が必要です:

Enter the function A1
hello A1!
Exit the function A1
Enter the function A2
hello A2!
Exit the function A2

その結果を得るには何が必要ですか?ありがとう

4

2 に答える 2

8

私はデコレータを使用します:

class Proxy(object):
    def __init__(self, object_a):
        self._object_a = object_a

    def decorateEnterExit(self, obj, f):
        def inner(*args, **kwargs):
            with obj as _:
                return f(*args, **kwargs)
        return inner

    def __getattribute__(self, name):
        obj = object.__getattribute__(self, '_object_a')
        dee = object.__getattribute__(self, 'decorateEnterExit')
        return dee(obj, getattr(obj, name))

そうすれば、 with は関数が実行されたときにのみ評価されます。あなたがそれをした方法は、最初に with を評価し(終了を含む)、次に関数が返されて呼び出されます。ここで、それ自体が with に入り、内部で関数を呼び出す関数を返します。

>>> Proxy(A('Ax')).hello()
Enter the function
hello Ax!
Exit the function

次のメソッドで返す必要があることに注意してselfください。__enter__A

def __enter__(self):
    print 'Enter the function'
    return self
于 2013-03-07T11:43:58.677 に答える