Python 代理 class

Python proxy class

我正在尝试为另一个 class 创建代理 class。我希望将此 class 传递到其构造函数中的代理,然后让代理在其自身上动态创建此 class 的所有相同方法。

这是我目前使用的方法,但没有用:

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 行,但我不确定要更改什么?

我是 Python 的新手,所以如果有完全不同的 Pythonic 方法来做这件事,我也很乐意听到。

我不会明确复制包装的方法 class。您可以使用魔术方法 __getattr__ 来控制在代理对象上调用某些内容时发生的情况,包括根据需要对其进行装饰; __getattr__ 必须 return 一个可调用对象,因此您可以使该可调用对象做任何您需要的事情(除了调用原始方法)。

我在下面包含了一个示例。

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)