2017-09-05 4 views
0

別のクラスのProxyクラスを作成しようとしています。このクラスをそのコンストラクタのプロキシに渡してから、プロキシがこのクラスのすべての同じメソッドを動的に作成するようにします。Pythonプロキシクラス

import inspect 
from optparse import OptionParser 

class MyClass: 

    def func1(self): 
     print 'MyClass.func1' 


    def func2(self): 
     print 'MyClass.func1' 


class ProxyClass: 

    def __init__(self): 
     myClass = MyClass() 
     members = inspect.getmembers(MyClass, predicate=inspect.ismethod) 
     for member in members: 
      funcName = member[0] 
      def fn(self): 
       print 'ProxyClass.' + funcName 
       return myClass[funcName]() 
      self.__dict__[funcName] = fn 

proxyClass = ProxyClass() 
proxyClass.func1() 
proxyClass.func2() 

私はそれを変更する必要があるラインself.__dict__[funcName] = fnだと思いますが、確認していないものに:

これは働いていないしている私は、これまでhvae何ですか?

私はPythonの初心者です。これを行うには全く別のPythonの方法があれば、私もそれについて聞いて嬉しいです。

+0

「動作していない」とは言いませんでした。なぜあなたはディクテーションの割り当てを変更する必要があると思いますか?それにもかかわらず、これは奇妙なアプローチです。 '__getattr__'をオーバーライドするだけで呼び出しを委譲したくない理由はありますか? –

+0

現在のエラーはproxyClass.func1()を呼び出すときです。関数がインスタンスに適切に配置されていないことを示す1つの引数をとる必要があると言います。 – user2802557

+0

プロキシパターンを使用するという全体の前提は、 /限界ect。元のクラスとのやりとりができます。メンバーをコピーするだけの理由が不思議です。プロキシコンストラクタにクラスを渡してselfsjectのようなものに割り当てるのではなく、プロキシで1:1のプロパティとメンバアクセスが必要な場合でも、 –

答えて

4

ラップされたクラスのメソッドを明示的にコピーしません。魔法の方法__getattr__を使って、プロキシオブジェクトで何かを呼び出すときに何が起きるかを制御することができます。 __getattr__は、呼び出し可能なオブジェクトを返さなければならないので、その呼び出し可能オブジェクトを(元のメソッドを呼び出すことに加えて)何でもすることができます。

以下に例を示します。

class A: 
    def foo(self): return 42 
    def bar(self, n): return n + 5 
    def baz(self, m, n): return m ** n 

class Proxy: 
    def __init__(self, proxied_object): 
     self.__proxied = proxied_object 

    def __getattr__(self, attr): 
     def wrapped_method(*args, **kwargs): 
      print("The method {} is executing.".format(attr)) 
      result = getattr(self.__proxied, attr)(*args, **kwargs) 
      print("The result was {}.".format(result)) 
      return result  
     return wrapped_method 

proxy = Proxy(A()) 
proxy.foo() 
proxy.bar(10) 
proxy.baz(2, 10) 
関連する問題