0

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

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'
    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()

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

hello A1!
hello A2!

しかし、withステートメントのコメントを外すと、エラーが発生します

Enter the function
Exit the function
Traceback (most recent call last):
  File "/home/hnng/workspace/web/src/test.py", line 30, in <module>
    b.hello()
  File "/home/hnng/workspace/web/src/test.py", line 24, in __getattribute__
    result = getattr(service, name)
AttributeError: 'NoneType' object has no attribute 'hello'
4

1 に答える 1

6

オブジェクトを返す代わりに、__enter__メソッドが返されています。Noneそれは読むべきです:

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